如何根据对不同集合的查找调用结果在mongodb集合中查找记录?

时间:2013-09-27 00:34:39

标签: mongodb meteor

我有以下收藏品:

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值?或者我的做法完全错了?

2 个答案:

答案 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});