我有一个看起来像这样的文件。
{
_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));
这可能与流星有关吗?
答案 0 :(得分:0)
您应该可以使用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
];
});
});