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