Mongoose:查找并过滤嵌套数组

时间:2016-09-26 16:24:28

标签: node.js filter mongoose nested 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)]);这样奇怪的东西 但没有成功..

有谁知道? 谢谢^^

2 个答案:

答案 0 :(得分:3)

尝试以下查询:

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

答案 1 :(得分: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
    }
}

要详细了解汇总,请参阅文档here