我有一个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个文档。
有什么想法吗?
答案 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
}
}
}])