2015-04-02 102 views
1

感谢您提前看这... 我的文档:MongoDB的过滤与聚合框架深度嵌套阵列

{ 
    "_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阶段中完成,但是您必须仔细阅读手册并找到适当的操作符。希望它会有所帮助。祝你好运。

+0

谢谢先生。很棒的作品;) – 2015-04-03 16:29:17