2017-02-16 21 views
1

У меня есть модель Мангуст, которая довольно проста:Mongoose запрашивая данные, которая нуждается в заполнении

aclSchema = mongoose.Schema({ 
    _id: String, 
    public_read: Boolean, 
    public_write: Boolean, 
}); 
aclModel = mongoose.model('acl', aclSchema); 

И еще одна модель, которая ссылается на это:

thingSchema = mongoose.Schema({ 
    _id: String, 
    _acl: { type: String, ref: 'acl' } 
}); 
thingModel = mongoose.model('thing', thingSchema); 

Мне нужно, чтобы быть в состоянии найти документы (thingModel), где _acl.public_read - это правда. Проблема, с которой я сталкиваюсь, заключается в том, что поскольку thing._acl является ref, он не заполняется до тех пор, пока запрос не будет выполнен.

пример:

thingModel.find({"_acl.public_read":true}).populate('_acl').exec(callback); 

Это не возвращает никаких результатов, потому что, я думаю, _acl это ссылка, и это никогда не заполняется до тех пор, после того, как находка возвращает документы.

Просто боковое примечание, схемы сложнее, чем у этого, и в них есть другие реф, которые могут быть круговыми. Я не включил их для простоты, но основная идея есть. Если бы это было действительно так просто, я бы использовал поддокументы, и все будет работать так, как ожидалось.

Есть ли лучший способ сделать это, чтобы получить ожидаемые документы?

ответ

1

Теперь вы можете сделать это в Монго 3.2 с помощью $lookup

$lookup принимает четыре аргумента

from: Определяет коллекцию в той же базе данных для выполнения присоединиться. Сбор не может быть отложен.

localField: Указывает поле из ввода документов на этап $ lookup. $ lookup выполняет сопоставление равенства на localField с foreignField из документов коллекции.

foreignField: Указывает поле из документов в коллекции.

as: Указывает имя нового поля массива для добавления во входные документы. В поле нового массива содержатся соответствующие документы из коллекции.

thingModel.aggregate([{ 

    $lookup: { 
    from: 'aclCollection', 
    localField: '_acl', 
    foreignField: '_id', 
    as : 'acl' 
    }, 
    {$unwind: '$acl'}, 
    {$match:{"acl.public_read":true }} 
], callback); 

В случае заполнения, это невозможно. См. Аналогичный вопрос Mongoose nested query on Model by field of its referenced model

+0

Точно, что мне нужно. Любой известный способ сделать это в <3.2? – Alex

+0

@Alex ответ обновлен. http://stackoverflow.com/questions/19380738/mongoose-nested-query-on-model-by-field-of-its-referenced-model – sidgate

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

  • Нет связанных вопросов^_^