我正在开发一个Meteor应用程序,该应用程序使用多个在树型组织中相互引用的集合。但是,它们在我的数据库结构中都表示为平面集合。例如,我有一个顶级Cars
集合,一个Parts
集合和一个Sellers
集合,看起来像这样(伪代码):
Cars {
_id:
make:
model:
year:
etc...
}
Parts {
_id:
carId: Cars._id
type:
desc:
etc...
}
Seller {
_id:
partId: Parts._id
location:
name:
etc...
}
所以他们在树中互相引用的方式如下:
Car
|
----> Part
| |
| ----> Seller
| |
| ----> Seller
| |
| ----> Seller
|
----> Part
|
----> Seller
|
----> Etc...
我遇到的问题是我使用了几个顶级出版物,我通过了Car._id
并希望查看Sellers
出售Parts
的所有Car
。所以在我的路线中,我有一个看起来像这样的订阅:
waitOn: function() {
return Meteor.subscribe('allSellersByCar', this.params._id);
}
所以要从Sellers
返回所有Car._id
,我会抓取与Parts
匹配的所有Car._id
,然后使用下划线_.pluck()
Part._id
1}}并找到与Sellers
数组匹配的所有Part._id
:
Meteor.publish('allSellersByCar', function(carId) {
var parts = Parts.find({carId: carId}).fetch();
return Sellers.find({partId: {$in: _.pluck(parts, "_id")}});
});
此方法正常工作并正确返回所有Sellers
。问题是这个方法只会在它们被添加到EXISTING Sellers
时重新返回Parts
,并且模板会按预期实时更新,但它不会返回任何添加到任何Sellers
的{{1}}添加到Parts
对象的新Car
。所以它似乎只是被动地更新了查询的最后一行。添加新Part
时,不会重新运行整个查询。但是如果刷新页面(以及路由),查询将重新运行并且所有内容都会正确返回。
我的应用程序中有多个这样的出版物,其中一些在返回之前还有几个“中间人”提取。我不确定如何解决这个或问题是什么。我的酒吧/潜水员错了吗?我是否应该对参考文献进行去标准化,并为每个carId
添加Seller
,这样我就可以直接在Seller
集合中进行查询,而不必查看Parts
{1}}获取?