Найдите документы с помощью Mongoose, где родитель и дочерний элемент соответствуют запросу

У меня есть следующие две схемы Mongoose для MongoDB:

// Parent Schema
var parentSchema = mongoose.Schema({
    status: { type: String, required: true }
    child: { type: mongoose.Schema.Types.ObjectId, ref: 'Child', required: true },
    ...
}

//Child schema
var childSchema = mongoose.Schema({
    status: { type: String, required: true }
    ...
}

Я хочу найти все родительские документы, в которых статус = опубликован, а статус дочернего документа = опубликован. Ни одно из следующих действий не дает желаемых результатов:

//This returns no documents
Parent.find({ 'status': 'published' })
    .where({ 'child.status': 'published' })
    .populate('child')
    .exec(function (err, results) {

//This returns no documents
Parent.find({ 'status': 'published' })
    .populate('child')
    .where({ 'child.status': 'published' })
    .exec(function (err, results) {

//This filters by parent status but not child status
Parent.find({ status: 'published' })
    .populate({
        path: 'child',
        match: { 'child.status': 'published' }
    })
    .exec(function (err, results) {

//This returns no documents 
Parent.find(
    {status: 'published', 'child.status': 'published'},
    {child:{$elemMatch:{status: 'published'}}})
    .exec(function (err, results) {

Это правильный подход или есть другая техника, которую следует использовать?


person Daniel Flippance    schedule 20.02.2014    source источник


Ответы (2)


В MongoDB невозможно запросить более одной коллекции в одном запросе. Если Child был встроен как вложенный документ в Parent, вы могли бы выполнить запрос к child.status, но поскольку это отдельная коллекция, на которую ссылается Parent, вы не можете этого сделать.

person nabeel    schedule 20.02.2014

Вы можете использовать Waterline, это больше похоже на ORM.

person Tony Gutierrez    schedule 03.12.2015