MongoDB聚合 - 按子文档过滤

时间:2015-04-14 07:35:47

标签: mongodb mongodb-query

我有一个mongodb集合,结构如下:

[
  {
    name: "name1",
    instances: [{value:1, score:2}, {value:2, score:5}, {value:2.5, score:9}]
  },
  {
    name: "name2",
    instances: [{value:6, score:3}, {value:1, score:6}, {value:3.7, score:5.2}]
  }
]

当我想从文档中获取所有数据时,我使用aggregate因为我希望每个实例都作为单独的文档返回:

db.myCollection.aggregate([{$match:{name:"name1"}}, {$unwind:"$instances"}, {$project:{name:1, value:"$instances.value", score:"$instances.score"}}])

一切都像我想要的那样。

现在我的问题是:我想按分数或按值过滤返回的数据。例如,我想要一个name1的所有子文档的数组,其值大于或等于2。 我尝试添加到$match对象'instances.value':{$gte:2},但它没有过滤任何内容,我仍然可以获得此查询的所有3个文档。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

展开instances后,再次使用$match,如下所示

    db.collectionName.aggregate({
    "$match": {
    "name": "name1"
    }
}, {
    "$unwind": "$instances"
}, {
    "$match": {
    "instances.value": {
        "$gte": 2
    }
    }
}, {
    $project: {
    name: 1,
    value: "$instances.value",
    score: "$instances.score"
    }
})

或者,如果您在$match之后尝试project,则按以下方式使用

 db.collectionName.aggregate([{
     $match: {
     name: "name1"
     }
 }, {
     $unwind: "$instances"
 }, {
     $project: {
     name: 1,
     value: "$instances.value",
     score: "$instances.score"
     }
 }, {
     "$match": {
     "value": {
         "$gte": 2
     }
     }
 }])