我有以下收藏品:
RideOffers
:用户在网站上发布的一系列乘车优惠,以及
BidsOnOffers
:上述乘车优惠的竞标集合。每次出价都与一次乘车优惠相关联
我想向用户发送她已发布的乘车优惠的出价列表,但不是所有乘车优惠的所有出价:用户应该只能看到她的车手优惠的出价,而不是任何竞标其他人的乘车优惠。有关如何做到这一点的任何想法?这是我到目前为止所提出的:
Meteor.publish('RideOffers', function() {
return RideOffers.find();
});
Meteor.publish('BidsOnMyOffers', function() {
var MyRideOffers = RideOffers.find({userId: this.userId, active: true});
return BidsOnOffers.find({ offerId: {$in : [MyRideOffers._id]}, active: true});
});
这显然不起作用,我认为有问题的部分是{$in : [MyRideOffers._id]}
。我是否尝试从MyRideOffers
获取一组_id值?或者我的做法完全错了?
答案 0 :(得分:3)
您的方法是正确的,但您的语法错误。
要从RideOffers集合构建一个id数组,请使用fetch(来自Meteor游标)获取文档数组,并使用“fields”选项从这些文档中仅选择_id属性:
var myRideOffersIds=RideOffers.find({
userId:this.userId,
active:true
},{
fields:{
_id:1
}
}).fetch();
然后您可以将此变量与$ in:
一起使用return BidsOnOffers.find({
offerId:{
$in:myRideOffersIds
},
active:true
});
答案 1 :(得分:1)
接受的答案建议使用fetch()和“fields”选项从RideOffers集合构建一个id数组,如下所示:
var myRideOffersIds=RideOffers.find({
userId:this.userId,
active:true
},{
fields:{
_id:1
}
}).fetch();
然后将此变量与$ in:
一起使用return BidsOnOffers.find({
offerId:{
$in:myRideOffersIds
},
active:true
});
然而,这对我没有用 - 没有文件被退回。我认为它失败了因为fetch()返回一个对象数组:每个对象只有一个字段,但它仍然是一个对象,所以数组类似于:[{id:“1233”},{id:“5678”} ]。但是“$ in”运算符只能搜索[“1234”,“5678”]形式的值数组。
我使用map将myRideOffersIds创建为一个简单的值数组:
var myRideOffersIds=RideOffers.find({
userId:this.userId,
active:true
}).map(function(val) {return val._id});