Mongodb 复杂流星出版物Isn';t按预期进行反应性更新
我正在开发一个Meteor应用程序,它使用多个集合,在树型组织中相互引用。但是,在我的数据库结构中,它们都表示为平面集合。例如,我有一个顶级的Mongodb 复杂流星出版物Isn';t按预期进行反应性更新,mongodb,meteor,iron-router,Mongodb,Meteor,Iron Router,我正在开发一个Meteor应用程序,它使用多个集合,在树型组织中相互引用。但是,在我的数据库结构中,它们都表示为平面集合。例如,我有一个顶级的Cars集合,一个Parts集合和一个Sellers集合,看起来像这样(伪代码): 因此,它们在树中相互引用的方式如下所示: Car | ----> Part | | | ----> Seller | | | ----> Seller | | | -
Cars
集合,一个Parts
集合和一个Sellers
集合,看起来像这样(伪代码):
因此,它们在树中相互引用的方式如下所示:
Car
|
----> Part
| |
| ----> Seller
| |
| ----> Seller
| |
| ----> Seller
|
----> Part
|
----> Seller
|
----> Etc...
waitOn: function() {
return Meteor.subscribe('allSellersByCar', this.params._id);
}
我遇到的问题是,我使用了一些顶级出版物,其中我通过了汽车。_id
并希望看到所有出售汽车零件的卖家。因此,在我的路线中,我有一个如下所示的订阅:
Car
|
----> Part
| |
| ----> Seller
| |
| ----> Seller
| |
| ----> Seller
|
----> Part
|
----> Seller
|
----> Etc...
waitOn: function() {
return Meteor.subscribe('allSellersByCar', this.params._id);
}
因此,要从汽车中返回所有卖家
。\u id
我获取所有与汽车匹配的零件。\u id
然后使用下划线.pulk()
零件。\u id
并找到所有与零件数组匹配的卖家。\u id
:
Meteor.publish('allSellersByCar', function(carId) {
var parts = Parts.find({carId: carId}).fetch();
return Sellers.find({partId: {$in: _.pluck(parts, "_id")}});
});
此方法工作正常,并正确返回所有卖家
。问题是此方法只会在添加到现有零件时创造性地返回卖家
,模板将按预期实时更新,但不会返回添加到添加到汽车
对象的任何新零件
的任何卖家
。因此,它似乎只会反应性地更新查询的最后一行。添加新的部分时,不会重新运行整个查询。但是,如果刷新页面(从而刷新路由),查询将重新运行,所有内容都将正确返回
我的应用程序中有多个类似的出版物,其中一些在返回之前还有多个“中间人”获取。我不知道如何解决这个问题,也不知道问题出在哪里。我的酒吧/潜水艇是不是搞错了?我是否应该对引用进行更多的反规范化,并向每个卖家添加carId
,这样我就可以直接在Seller
集合中一行进行查询,而不必查看部分
获取?问题的可能重复之处在于发布功能不是被动的。具体地说,您的parts变量和从中创建的id数组不是反应数据源,因此发布不会重新运行它们。有各种各样的策略使其反应,所以我建议《探索流星》的“反应性连接”一章来看看实现这一点的选项:啊,是的。我不久前读过那篇文章,直到现在我还是有点不知所措。这篇文章很有帮助,谢谢。我认为对我来说,仅仅是一点点去规范化可能会有很大的帮助。