2016-04-24 57 views
0

我期待檢索在一組我的集合中的所有值的集合的所有值:檢索MongoDB中

例子:

` "_id" : { 
     "origin" : "xx", 
     "destination" : "yy" 
    }, 
    "paths" : [ 
     [ 
      "tt" 
     ] 
    ] 
} 

/* 2 */ 
{ 
    "_id" : { 
     "origin" : "aa", 
     "destination" : "bb" 
    }, 
    "paths" : [ 
     [ 
      "cc" 
     ] 
    ] 

} 

/* 3 */ 
{ 
    "_id" : { 
     "origin" : "xy", 
     "destination" : "yx" 
    }, 
    "paths" : [ 
     [ 
      "yy", 
      "tt", 
      "cc" 
     ] 
    ] 

}` 

預期輸出:

Nodes : {"xx", "yy", "aa", "bb","xy", "yx"} 

我試過$setUnion但它不起作用,因爲我有字符串

$addToset 

是不可能添加這兩個字段:「原點」和「目的地」

如何檢索集合的所有字段(id.origin和id.destination)到集?

謝謝

+1

請更新您的問題,並通過樣例MongoDB文檔支持它。沒有完整的信息就很難找到一個好的解決方案。 – Saleem

+0

我用樣本更新了我的問題。 謝謝 – MAYA

回答

1

在聚合管道首先你可以擁有兩套(Originset和DestinationSet)後,您可以使用setUnion有工會集中的兩個集。

+0

當我這樣做: 'db.test.aggregate( {$ 組:{ _id: 「$起源」, }, $組:{ _id: 「$目的地」, } } )' 結果是一組只由目的地而不是兩個字段 – MAYA

+0

謝謝。它的作品非常好:) – MAYA

2

由於這是非常特殊的情況下,你想自定義格式,你最好的選擇將是MongoDB的map-reduce功能。但是,這種格式化也可以在聚合框架的幫助下實現。我添加了兩個解決方案。

聚合框架:

db.collection.aggregate([ 
    { 
    $group:{ 
     _id:null, 
     origin:{ 
     $addToSet:"$_id.origin" 
     }, 
     destination:{ 
     $addToSet:"$_id.destination" 
     } 
    }}, 
    { 
    $project:{ 
     _id:0, 
     Nodes:{ 
     $setUnion:["$origin","$destination"] 
     } 
    }} 
]) 

輸出:

{ 
    "Nodes" : [ 
     "yy", 
     "yx", 
     "xx", 
     "bb", 
     "aa", 
     "xy" 
    ] 
} 

的Map Reduce:

db.collection.mapReduce(
    function() { 
     emit(1, this._id); 
    }, 
    function (key, values) { 
     var o = {}; 
     o.Nodes = []; 

     for (var i = 0; i < values.length; i++) { 
      o.Nodes.push(values[i].origin); 
      o.Nodes.push(values[i].destination); 
     } 

     return o; 
    }, 
    { 
     out: { inline: 1 } 
    }); 

輸出:

{ 
    "results" : [ 
     { 
      "_id" : NumberInt(1), 
      "value" : { 
       "Nodes" : [ 
        "xx", 
        "yy", 
        "aa", 
        "bb", 
        "xy", 
        "yx" 
       ] 
      } 
     } 
    ], 
    "timeMillis" : NumberInt(22), 
    "counts" : { 
     "input" : NumberInt(3), 
     "emit" : NumberInt(3), 
     "reduce" : NumberInt(1), 
     "output" : NumberInt(1) 
    }, 
    "ok" : NumberInt(1) 
} 

results.values.Nodes包含您想要的結果。