【问题标题】:How to find parent doc by querying subdocument using Mongoose?如何通过使用 Mongoose 查询子文档来查找父文档?
【发布时间】:2016-03-24 15:18:25
【问题描述】:

在下面的示例中,如何找到特定成员 ID 具有 Membership(子文档)的 Account(父)文档?我尝试过同时使用$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
});

【问题讨论】:

  • 发生了什么/没有发生什么让您认为这不起作用?从这里看起来是正确的。

标签: node.js mongodb mongoose mongoose-schema


【解决方案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.
});

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2015-04-27
    • 2021-04-04
    • 2020-07-16
    • 2013-02-06
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多