是否有用于基于字段过滤所有嵌套/子文档的 Mongo 函数?

Sim*_* L. 3 mongodb mongodb-query spring-data-mongodb

我在 MongoDB 中有一些文档,其中有其他嵌套文档都带有“活动”字段。例如 :

{
    "id": "PRODUCT1",
    "name": "Product 1",
    "active": true,
    "categories": [
        {
            "id": "CAT-1",
            "active": true,
            "subcategories": [
                {
                    "id": "SUBCAT-1",
                    "active": false
                },
                {
                    "id": "SUBCAT-2",
                    "active": true
                }
            ]
        },
        {
            "id": "CAT-2",
            "active": false,
            "subcategories": [
                {
                    "id": "SUBCAT-3",
                    "active": true
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

有没有办法找到所有文档但只保留“活动”嵌套文档。

这是我想要的结果:

{
    "id": "PRODUCT1",
    "name": "Product 1",
    "active": true,
    "categories": [
        {
            "id": "CAT-1",
            "active": true,
            "subcategories": [
                {
                    "id": "SUBCAT-2",
                    "active": true
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

知道我事先不知道文档架构。这就是为什么我需要一种有条件的通配符投影......(即*.active=true)。这是可能的还是必须在服务器端完成?

use*_*814 6

使用$redact.

db.collection.aggregate(
   [
     { $redact: {
        $cond: {
           if: { $eq:["$active", true] },
           then: "$$DESCEND",
           else: "$$PRUNE"
         }
       }
     }
   ]
);
Run Code Online (Sandbox Code Playgroud)

https://mongoplayground.net/p/7UMphkH5OWn