2013-09-27 1 views
2

У меня есть следующие коллекции:Как найти записи в коллекции mongodb на основе результатов поиска в другой коллекции?

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? Или мой подход совершенно неправильный?

ответ

3

Ваш подход правильный, но ваш синтаксис неверен.

Чтобы построить массив идентификаторов из вашей коллекции RideOffers используйте выборки (от Метеор курсоров) для получения массива документов и «полей», чтобы выбрать только свойство _id из этих документов:

var myRideOffersIds=RideOffers.find({ 
    userId:this.userId, 
    active:true 
},{ 
    fields:{ 
     _id:1 
    } 
}).fetch(); 

Затем вы можете использовать эту переменную $ в:

return BidsOnOffers.find({ 
    offerId:{ 
     $in:myRideOffersIds 
    }, 
    active:true 
}); 
+1

Чтобы быть еще более эффективным, использование '{полей: {_ID: 1}}' в качестве второго аргумента и вам даже не придется «срывать». –

+0

Не думал об этом варианте, который лучше, поэтому я отредактировал свой ответ, nice =) – saimeunt

+0

На самом деле, отредактированная версия этого ответа сработала для меня (тот, который использует '_.pluck'. (можно, я просто пропустил что-то простое). –

1

Принятый ответ предполагает использование выборки() с «полей», чтобы создать массив идентификаторов из вашей коллекции RideOffers, как это:

var myRideOffersIds=RideOffers.find({ 
    userId:this.userId, 
    active:true 
},{ 
    fields:{ 
     _id:1 
    } 
}).fetch(); 

, а затем использовать эту переменную $ в:

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}); 
+0

Ваш ответ трудно выполнить. Пожалуйста, перепишите его, чтобы сделать его понятным для вопрошающего. Спасибо. –

+0

Является ли отредактированная версия лучше? –

Смежные вопросы