2

我有以下收藏:

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]},我想有问题的部分是 。我是否尝试从中获取 _id 值的数组MyRideOffers?还是我的方法完全错误?

4

2 回答 2

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
});
于 2013-09-27T00:52:40.623 回答
1

接受的答案建议使用带有“字段”选项的 fetch() 从您的 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});
于 2015-10-04T11:13:14.873 回答