MongoDB 过滤嵌套数组
MongoDB filter nested array
我有一个看起来像这样的集合:
[
{
"_id": 1,
"title": "dummy title",
"settings": [
{
"type": "light",
"status": "enabled"
},
{
"type": "flare",
"status": "disabled"
},
{
"type": "toolbar",
"status": "enabled"
}
]
}
]
我想通过 Id 获取它,但只能使用“启用”设置,并且不确定聚合管道应该是什么样子。
我应该在 Java / Kotlin 中使用 mongo 模板创建查询,但即使只是 mongo 查询就足够了。
//working code from MongoDB shell/CLI version 4.26(on windows 10 machine/OS)
> db.titles.find().pretty();
{
"_id" : 1,
"title" : "dummy title",
"settings" : [
{
"type" : "light",
"status" : "enabled"
},
{
"type" : "flare",
"status" : "disabled"
},
{
"type" : "toolbar",
"status" : "enabled"
}
]
}
> db.titles.aggregate([
... {$unwind:"$settings"},
... {$match:{"settings.status":"enabled"}}
... ]);
{ "_id" : 1, "title" : "dummy title", "settings" : { "type" : "light", "status" : "enabled" } }
{ "_id" : 1, "title" : "dummy title", "settings" : { "type" : "toolbar", "status" : "enabled" } }
> print("MongoDB: ",db.version());
MongoDB: 4.2.6
>
你可以用 $filter
db.collection.aggregate([
{
$project: {
_id: 1,
title: 1,
settings: {
$filter: {
input: "$settings",
as: "item",
cond: {
$eq: [
"$$item.status",
"enabled"
]
}
}
}
}
}
])
试一试here
我有一个看起来像这样的集合:
[
{
"_id": 1,
"title": "dummy title",
"settings": [
{
"type": "light",
"status": "enabled"
},
{
"type": "flare",
"status": "disabled"
},
{
"type": "toolbar",
"status": "enabled"
}
]
}
]
我想通过 Id 获取它,但只能使用“启用”设置,并且不确定聚合管道应该是什么样子。
我应该在 Java / Kotlin 中使用 mongo 模板创建查询,但即使只是 mongo 查询就足够了。
//working code from MongoDB shell/CLI version 4.26(on windows 10 machine/OS)
> db.titles.find().pretty();
{
"_id" : 1,
"title" : "dummy title",
"settings" : [
{
"type" : "light",
"status" : "enabled"
},
{
"type" : "flare",
"status" : "disabled"
},
{
"type" : "toolbar",
"status" : "enabled"
}
]
}
> db.titles.aggregate([
... {$unwind:"$settings"},
... {$match:{"settings.status":"enabled"}}
... ]);
{ "_id" : 1, "title" : "dummy title", "settings" : { "type" : "light", "status" : "enabled" } }
{ "_id" : 1, "title" : "dummy title", "settings" : { "type" : "toolbar", "status" : "enabled" } }
> print("MongoDB: ",db.version());
MongoDB: 4.2.6
>
你可以用 $filter
db.collection.aggregate([
{
$project: {
_id: 1,
title: 1,
settings: {
$filter: {
input: "$settings",
as: "item",
cond: {
$eq: [
"$$item.status",
"enabled"
]
}
}
}
}
}
])
试一试here