2014-11-24 161 views
0

比方说,我有对象的集合:的MongoDB聚合管道,并结合深度嵌套对象

{ 
    _id : 1, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    list2 : [ 
     { name: 'Another name', value: 'Another value' } 
    ], 
    deeper : { 
     list3 : [ 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
     ] 
    } 
} 

使用聚合管道怎么会返回名称/值对象的一个​​列表? 结果应该是:

{ 
    _id : 1, 
    combinedList : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' }, 
     { name: 'Another name', value: 'Another value' }, 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
    ] 
} 

第2部分:

现在,如何从扁平化整个集合深度嵌套的对象到一个单一的反应?例如:

{ 
    "_id" : 0, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    list2 : [ 
     { name: 'Another name', value: 'Another value' } 
    ] 
}, 
{ 
    "_id" : 1, 
    list1 : [ 
     { name: 'This is my name', value: 'This is my value' }, 
     { name: 'name number 2', value: 'value number 2' } 
    ], 
    deeper : { 
     list2 : [ 
     { name: 'Another name but even deeper', value: 'Another value but deeper' } 
     ] 
    } 
} 

结果应该与上面的文档相同(combinedList)。

回答

1

可以使用aggregatesetUnion

db.coll.aggregate([ 
    { 
     $match:{_id:1} 
    }, 
    { 
     $project: {_id: 0 , 
        combinedList: { $setUnion: [ "$deeper.list3","$list2", "$list1" ] }} 
    } 
    ] 
) 

结果

{ 
    "result" : [ 
     { 
      "combinedList" : [ 
       { 
        "name" : "Another name but even deeper", 
        "value" : "Another value but deeper" 
       }, 
       { 
        "name" : "Another name", 
        "value" : "Another value" 
       }, 
       { 
        "name" : "name number 2", 
        "value" : "value number 2" 
       }, 
       { 
        "name" : "This is my name", 
        "value" : "This is my value" 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 

http://docs.mongodb.org/manual/reference/operator/aggregation/setUnion/

你必须使用2.6版。

+0

谢谢@Barno!我可以通过更多维度吗?如果我有一个列表,每个对象都有一个列表,该怎么办?例如: { – JayJohnsonDesigns 2014-11-24 19:09:01

+0

@JayJohnsonD​​esigns欢迎您。你能写一个例子吗? – Barno 2014-11-24 19:38:36

+0

我将示例添加到了我的原始问题中。 – JayJohnsonDesigns 2014-11-24 21:54:56