Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 复杂流星出版物Isn';t按预期进行反应性更新_Mongodb_Meteor_Iron Router - Fatal编程技术网

Mongodb 复杂流星出版物Isn';t按预期进行反应性更新

Mongodb 复杂流星出版物Isn';t按预期进行反应性更新,mongodb,meteor,iron-router,Mongodb,Meteor,Iron Router,我正在开发一个Meteor应用程序,它使用多个集合,在树型组织中相互引用。但是,在我的数据库结构中,它们都表示为平面集合。例如,我有一个顶级的Cars集合,一个Parts集合和一个Sellers集合,看起来像这样(伪代码): 因此,它们在树中相互引用的方式如下所示: Car | ----> Part | | | ----> Seller | | | ----> Seller | | | -

我正在开发一个Meteor应用程序,它使用多个集合,在树型组织中相互引用。但是,在我的数据库结构中,它们都表示为平面集合。例如,我有一个顶级的
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数组不是反应数据源,因此发布不会重新运行它们。有各种各样的策略使其反应,所以我建议《探索流星》的“反应性连接”一章来看看实现这一点的选项:啊,是的。我不久前读过那篇文章,直到现在我还是有点不知所措。这篇文章很有帮助,谢谢。我认为对我来说,仅仅是一点点去规范化可能会有很大的帮助。