如何通过使用 Mongoose 查询子文档来查找父文档?

How to find parent doc by querying subdocument using Mongoose?

在下面的示例中,如何找到特定成员 ID 具有 Membership(子文档)的 Account(父)文档?我尝试同时使用 $elemMatch 和直接查询对象。

注意: 两个模式都有一个已删除的标志字段 (dd)。如果设置了此字段,则记录已被删除,不应 returned:

var mongoose    = require('mongoose')

var membershipSchema = new mongoose.Schema({

    m : { type: mongoose.Schema.ObjectId, ref: 'member' },      // Member
    b : { type: Date, required: true },                         // Begin Date
    e : { type: Date },                                         // End Date

    dd  : { type: Date },                                       // Deleted Date
    dm  : { type: mongoose.Schema.ObjectId, ref: 'member' }     // Deleted By Member
});

var accountSchema = new mongoose.Schema({

    n   : { type: String, trim: true },                         // Display Name

    m   : [ membershipSchema ],                                 // Membership List

    dd  : { type: Date },                                       // Deleted Date
    dm  : { type: mongoose.Schema.ObjectId, ref: 'member' }     // Deleted By Member
});

var accountModel = mongoose.model('account', accountSchema);

module.exports = accountModel;

我想要 return 所有 Account 文档,有或没有 Membership 子文档。但是,执行查询时,我将不知道有关 Account 的任何信息。

这就是我正在尝试的:

var query = {
    m : {
        $elemMatch: {
            m  : req.appData.member.id,
            dd : { $exists: false }
        }
    },
    dd : { $exists: false }
};

Account.find(query, function (err, accounts) {
    // Do something
});

我已经测试了好几次,上面的语法是正确的。使用所示的 query 对象将导致返回所有顶级 Account 对象,其中成员的 ID 存在于子文档中。并且,通过检查 dd 字段(您的删除标志)是否存在(或不存在),只会返回未标记为 "deleted" 的对象。

以防万一您需要调整您的原始问题。这是我们正在讨论的正确语法:

var query = {
    m : {
        $elemMatch: {
            m  : req.appData.member.id,
            dd : { $exists: false }
        }
    },
    dd : { $exists: false }
};

Account.find(query, function (err, accounts) {
    // accounts will contain an array of valid
    // items and will be populated with the
    // subdocuments.
});