使用Mongoose查找文档,其中父级和子级都匹配查询

时间:2014-02-20 08:13:43

标签: node.js mongodb mongoose querying

我有一个MongoDB的以下2个Mongoose模式:

// 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 }
    ...
}

我想查找status =已发布的所有父文档以及子文档status =已发布的位置。以下都不能产生预期的结果:

//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) {

这是正确的方法还是应该使用不同的技术?

2 个答案:

答案 0 :(得分:2)

在MongoDB中,无法在单个查询中查询多个集合。如果在Child中嵌入了Parent作为子文档,那么您可以对child.status进行查询,但由于它是Parent中引用的单独集合,因此您无法执行此操作。

答案 1 :(得分:0)

你可以使用Waterline,它更像ORM。