筛选嵌套对象的MongoDB数组



我使用MongoDB Compass进行查询,同时搜索我继承的大量数据,经常被要求为各个团队生成数据报告,但文档中的数据太多,无法轻松解析,所以我想尽可能减少上报告的数据

我有以下示例文档

{
"_id": "123456",
"name": "Bob",
"date": "2022-07-01",
"fruit": [
{
"_id": "000001",
"foodName": "apple",
"colour": "red"
},
{
"_id": "000002",
"foodName": "apple",
"colour": "green"
},
{
"_id": "000003",
"foodName": "banana",
"colour": "yellow"
},
{
"_id": "000004",
"foodName": "orange",
"colour": "orange"
}
]
}

使用

db.people.find( { "fruit.foodName" : "apple" } )

返回整个文档

我只想搜索苹果,这样我就能得到结果:

{
"_id": "123456",
"name": "Bob",
"date": "2022-07-01",
"fruit": [
{
"_id": "000001",
"foodName": "apple",
"colour": "red"
},
{
"_id": "000002",
"foodName": "apple",
"colour": "green"
}
]
}

这可能吗?

您需要为此使用聚合并使用$filter运算符。您不能为此使用查询语言的原因是因为它们的投影选项有限,只允许投影单个数组元素,因为在您的情况下,数组可以包含多个匹配的子文档,这是不可能的。

你可以在这里阅读更多关于查询语言投影的信息

db.collection.aggregate([
{
$match: {
"fruit.foodName": "apple"
}
},
{
$addFields: {
fruit: {
$filter: {
input: "$fruit",
cond: {
$eq: [
"$$this.foodName",
"apple"
]
}
}
}
}
}
])

Mongo游乐场

最新更新