2

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

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

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;

我想退回所有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
});
4

1 回答 1

1

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

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

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.
});
于 2015-12-18T14:32:25.053 回答