Spring数据mongodb层次结构

时间:2017-02-09 03:41:27

标签: mongodb mongodb-query aggregation-framework spring-data-mongodb

我在下面定义的层次结构中有一个嵌套的json对象

[
    {
        "categoryId": 1,
        "categoryName": "Category 1",
        "childCategory": null,
        "active": false
    },
    {
        "categoryId": 2,
        "categoryName": "Category 2",
        "active": true,
        "childCategory": [
            {
                "categoryId": 4,
                "categoryName": "Category 4",
                "childCategory": null,
                "active": false
            },
            {
                "categoryId": 5,
                "categoryName": "Category 5",
                "childCategory": null,
                "active": true
            }
        ]
    },
    {
        "categoryId": 10,
        "categoryName": "Category 10",
        "childCategory": null,
        "active": true
    }
]

由此我想要将所有活动类别选择为单个数组结构。我的输出应该是

[
    {
        "categoryId": 2,
        "categoryName": "Category 2",
        "active": true
    },
    {
        "categoryId": 5,
        "categoryName": "Category 5",
        "active": true
    },
    {
        "categoryId": 10,
        "categoryName": "Category 10",
        "active": true
    }
]

是否可以在单个查询语句中直接获取此数据。我正在使用mongodb的spring数据。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。

$redact一次浏览一个文档级别,并根据匹配条件执行$$DESCEND$$PRUNE

$unwind $childCategorypreserveNullAndEmptyArrays一起使数组保持null值。

db.collection.aggregate({
    $redact: {
        $cond: [{
            $eq: ["$active", true]
        }, "$$DESCEND", "$$PRUNE"]
    }
}, {
    $unwind: {
        path: "$childCategory",
        preserveNullAndEmptyArrays: true
    }
})