在观察者中发布其他游标

Publish additional cursors within an observer

本文关键字:其他 游标 布其他 观察者      更新时间:2023-09-26

我有一个文档是这样的。

{
  _id: ObjectId,
  orders: [ObjectId, ObjectId]
}

对这些订单的查找将产生类似于的结果

{
  _id: ObjectId,
  products: [ObjectId, ObjectId, ObjectId]
}

现在,我的出版物将找到并观察父Meteor.users

Meteor.publish(function () {
  let handle = Meteor.users.find(this.userId).observe({
    added: doc => {
      // publish all orders
      // publish all products within that order
    },
    changed: doc => { /** same as above */ }
  });
  this.ready();
  this.onStop(() => handle.stop());
});

当这些变化时,我想修改顶层文档并发布它。也就是说:

this.changed('user', doc._id, publishRelations(doc));

这可能与流星有关吗?

您应该能够使用peerlibrary:reactive publish来实现这一点。您只需将要发布的光标包装在出版物中的自动运行中即可。只要其中一个反应依赖项(在本例中为三个游标)发生变化,就应该重新运行:

Meteor.publish("userOrders", function() {
   var self = this;
   self.autorun(function() {
      var productIds = [];
      // get logged in user
      var userCursor = Meteor.users.find(self.userId);
      //  get orders belonging to logged in user
      var ordersCursor = Orders.find({userId: self.userId});

      // create array of product Ids from user's orders  
      // You could probably make this better by omitting duplicates  
      ordersCursor.forEach(function(doc, index) {
        _.each(doc.products, function(productId) {
           productIds.push(productId);
         });
      });
      // get products in array
      var productsCursor = Products.find({ _id: { $in : productIds } });
      // return array of cursors
      return [
         userCursor,
         ordersCursor,
         productsCursor
      ];
   });
});