Mongoose:查找并过滤嵌套的数组

我试图用Find()命令Find()整个文档,并用条件筛选嵌套数组。

这里使用了一个Schema:

 var ListSH = new Schema({ name: { type: String, unique: true, required: true}, subject : String, recipients : [ Schema({ uid : { type : ObjectId, required : true, ref:'User', unique: true}, status : { type : Number, default : 1 } },{_id: false}) ] }; 

目前我做ListModel.findOne({ _id : req.params.id_list, function(err,list){...};

邮差给我:

 { "_id": "57e6bcab6b383120f0395aed", "name": "Emailing listname", "subject": "List subject", "recipients": [ { "uid": "57e932bcbbf0e9e543def600", "status": 0 }, { "uid": "57e93266c3c0b1dc1625986f", "status": 1 } ] } 

我希望Postman通过添加一个recipients.status : 1条件来返回类似的东西

  { "_id": "57e6bcab6b383120f0395aed", "name": "Emailing listname", "subject": "List subject", "recipients": [ { "uid": "57e93266c3c0b1dc1625986f", "status": 1 } ] } 

我已经尝试过ListModel.findOne({ _id : req.params.id_list, 'recipients.status' : 1}, function(err,list){...};

和一些奇怪的喜欢populate([$match('recipients.status : 1)]); 但没有成功..

有谁知道 ? 谢谢^^

你可以像这样用一个简单的方法使用aggregate来获得它

 ListModel.aggregate( { $match: {_id: ObjectId("57e6bcab6b383120f0395aed")}}, { $unwind: '$recipients'}, { $match: {'recipients.status':1}}) 

产量

 { "_id" : ObjectId("57e6bcab6b383120f0395aed"), "name" : "Emailing listname", "subject" : "List subject", "recipients" : { "uid" : "57e93266c3c0b1dc1625986f", "status" : 1 } } 

要详细了解汇总,请参阅此处的文档

试试下面的查询:

 ListModel.findOne({"_id" : "57e6bcab6b383120f0395aed", 'recipients.status' : 1},{_id:1, name: 1, subject:1,'recipients.$': 1}, function(err,list){...});