我有一个文档是这样的。
{
_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
];
});
});