如何通过使用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. });