我有一个模板,显示来自三个不同集合Cars
,CarPaints
和CarPaintTypes
的文档。我知道我在路由器级别需要所有这些。该模板将显示Car
文档,引用CarPaints
的所有Car
以及分别引用返回的CarPaintTypes
的所有CarPaints
(认为嵌套列表) )。到模板的路线从代表id
的网址中获取Car._id
。
Cars
集合和CarPaints
集合都使用Car._id
作为字段(它是_id
集合的原生Cars
和字段在CarPaints
集合中)这很容易。但是,CarPaintTypes
使用CarPaint._id
作为对其所属CarPaint
的引用。
所以我有三个出版物:
Meteor.publish('car', function(carId) {
return Cars.find({_id: carId});
});
Meteor.publish('carPaints', function(carId) {
return CarPaints.find({carId: carId});
});
Meteor.publish('carPaintTypes', function(carPaintId) {
return CarPaintTypes.find({carPaintId: carPaintId});
});
我的路线如下:
this.route('car', {
path: '/car/:_id',
waitOn: function() {
return [Meteor.subscribe('car', this.params._id),
Meteor.subscribe('carPaints', this.params._id)];
// Can't figure out how to subscribe to or publish
// the carPaintTypes using all the results of what gets
// returned by 'carPaints'
}
});
我的问题是CarPaintTypes
没有Car._id
字段,只有CarPaint._id
引用CarPaint
文档。我在何处以及如何将订阅结果发送到carPaints
并将每个返回订阅的carPaint
文档传递给carPaintTypes
?或者有没有办法将它们全部合并到出版物中?以后在我的助手中做得更好吗?我想因为我知道在路由级别需要什么,所有的订阅调用都应该在路由代码中。
答案 0 :(得分:1)
你可以在Meteor.publish
方法中抓取所有3个游标,然后只返回它们:
Meteor.publish('carThings', function(carId){
var carPaint = CarPaints.findOne({carId:carId});
return [
Cars.find({_id: carId}),
CarPaints.find({carId: carId}),
CarPaintTypes.find({carPaintId: carPaint._id});
]
})
在客户端:
this.route('car', {
path: '/car/:_id',
waitOn: function() {
return [Meteor.subscribe('carThings', this.params._id)]
}
}
答案 1 :(得分:0)
在Kuba Wyrobek的帮助下,我明白了。对于我想要实现的目标,发布看起来像这样:
Meteor.publish('carThings', function(carId){
var carPaints = CarPaints.find({carId: carId}).fetch();
return [
Cars.find({_id: carId}),
CarPaints.find({carId: carId}),
CarPaintTypes.find({carPaintId: {$in: _.pluck(carPaints, "_id")}})
];
});
我没有得到你可以在你的出版物块内进行操作。这超级酷,灵活。谢谢你的帮助。