【问题标题】:Mongodb filtering deeply nested arrays with aggregation frameworkMongodb 使用聚合框架过滤深度嵌套的数组
【发布时间】:2015-06-07 21:38:29
【问题描述】:

提前感谢您查看此内容... 我的文件:

{
    "_id" : { "$oid" : "550b2873e9dd90068070c31b" },
    "dateCreated" : { "$date" : 1426794611867 },
    "sections" : [
        {
            "_id" : { "$oid" : "550b2881e9dd90068070c31d" },
            "index" : 0,
            "name" : "Section 2",
            "slides" : [
                {
                    "_id" : { "$oid" : "550b288ce9dd90068070c321" },
                    "index" : 0,
                    "status" : "Unpublished"
                },
                {
                    "_id" : { "$oid" : "55105b87e9dd90068033ba4a" },
                    "index" : 1,
                    "status" : "Published"
                }
            ]
        },
        {
            "_id" : { "$oid" : "550b287ae9dd90068070c31c" },
            "index" : 1,
            "name" : "Section 1",
            "slides" : [
                {
                    "_id": { "$oid": "550b2888e9dd90068070c31f" },
                    "index" : 0,
                    "status": "Unpublished"
                },
                {
                    "_id" : { "$oid" : "550b288be9dd90068070c320" },
                   "index" : 1,
                   "status" : "Unpublished"
                }
            ]
        }
    ]
}

以及我们只返回包含所有已发布幻灯片的至少一张已发布幻灯片的部分的期望结果

{
    "_id" : { "$oid" : "550b2873e9dd90068070c31b" },
    "dateCreated" : { "$date" : 1426794611867 },
    "sections" : [
        {
            "_id" : { "$oid" : "550b2881e9dd90068070c31d" },
            "index" : 0,
            "name" : "Section 2",
            "slides" : [
                {
                    "_id" : { "$oid" : "55105b87e9dd90068033ba4a" },
                    "index" : 1,
                    "status" : "Published"
                }
            ]
        }
    ]
}

到目前为止,我有这个:

col.aggregate
([
    {$match : {'name': name}},
    {$unwind:'$sections'},
    {$unwind:'$sections.slides'},
    {$match:{'$sections.slides.status': "Published"}},
    {$group:{_id:'$_id', slides:{$push:'$slides'}}}
]) 

我很难理解分组,特别是将每个幻灯片数组嵌套在其父节数组中。另外,我想省略任何空白部分。

我以前从未使用过聚合方法,但我相信这是正确的方法。当涉及到深度嵌套的数组时,mongo 文档有点稀疏。

【问题讨论】:

    标签: arrays nested grouping aggregation


    【解决方案1】:

    阅读 MongoDB 管道的 $redact 阶段。 在第一次迭代中,我这样做了:

    .aggregate({ 
        $redact: { 
            $cond: { 
                if: { $eq: ["$status", "Unpublished"] }, 
                then: "$$PRUNE", 
                else: "$$DESCEND"
            }
        }
     }, { 
        $redact: { 
            $cond: { 
                if: { $eq: ["$slides", []] }, 
                then: "$$PRUNE", 
                else: "$$DESCEND"
            }
        }
     })
    

    您可以尝试以更优雅的方式重写它。我很确定有一种方法可以通过单个 $redact 阶段来实现,但是您必须浏览手册并找到合适的操作员。希望它会有所帮助。祝你好运。

    【讨论】:

    • 谢谢先生。效果很好;)
    猜你喜欢
    • 2018-11-17
    • 1970-01-01
    • 2023-03-28
    • 2020-09-24
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多