Mongodb 使用聚合框架过滤深度嵌套的数组

Posted

技术标签:

【中文标题】Mongodb 使用聚合框架过滤深度嵌套的数组【英文标题】:Mongodb filtering deeply nested arrays with aggregation framework 【发布时间】: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 文档有点稀疏。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢先生。效果很好;)

以上是关于Mongodb 使用聚合框架过滤深度嵌套的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 聚合中展开嵌套对象数组?

具有嵌套对象数组的 MongoDB 聚合

如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)

在 MongoDB 中聚合双嵌套数组的文档

mongodb aggregate

如何在 Mongodb 中对多个数组使用聚合映射和过滤器