如何通过使用Mongoose查询子文档来查找父文档?
在下面的示例中,如何查找特定成员标识具有Membership
(子文档)的Account
(父级)文档? 我曾尝试使用$elemMatch
和直接查询对象。
注意:两个模式都有一个删除的标志字段( dd
)。 如果设置了这个字段,logging已经被删除,不应该被返回:
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 });
我已经testing了几次,上面的语法是正确的。 如图所示使用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. });