MongoDB 聚合 - 按子文档过滤
MongoDB aggregate - filter by subdocument
我有一个 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 个文档。
有什么想法吗?
展开后 instances
然后再次使用 $match
如下
db.collectionName.aggregate({
"$match": {
"name": "name1"
}
}, {
"$unwind": "$instances"
}, {
"$match": {
"instances.value": {
"$gte": 2
}
}
}, {
$project: {
name: 1,
value: "$instances.value",
score: "$instances.score"
}
})
或者,如果您在 project
之后尝试 $match
,然后按如下方式使用
db.collectionName.aggregate([{
$match: {
name: "name1"
}
}, {
$unwind: "$instances"
}, {
$project: {
name: 1,
value: "$instances.value",
score: "$instances.score"
}
}, {
"$match": {
"value": {
"$gte": 2
}
}
}])
我有一个 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 个文档。
有什么想法吗?
展开后 instances
然后再次使用 $match
如下
db.collectionName.aggregate({
"$match": {
"name": "name1"
}
}, {
"$unwind": "$instances"
}, {
"$match": {
"instances.value": {
"$gte": 2
}
}
}, {
$project: {
name: 1,
value: "$instances.value",
score: "$instances.score"
}
})
或者,如果您在 project
之后尝试 $match
,然后按如下方式使用
db.collectionName.aggregate([{
$match: {
name: "name1"
}
}, {
$unwind: "$instances"
}, {
$project: {
name: 1,
value: "$instances.value",
score: "$instances.score"
}
}, {
"$match": {
"value": {
"$gte": 2
}
}
}])