2016-04-24 3 views
0

私は、単一のセット内の私のコレクションのすべての値を取得しているよでコレクションのすべての値を取得します。私はを試しましたが、文字列があるので動作しませんMongoDBの

$addToset 

両方のフィールドを追加することは不可能である:「起源」と「宛先」

セットに私のコレクションのフィールド(id.originとid.destination)のすべての値を取得するにはどのように?

は、最初に、二組(OriginsetとDestinationSet)を持つことができ、その後、あなたが2セットの和集合を持つようにsetUnionを使用することができます集約パイプラインであなた

+1

質問を更新し、サンプルのMongoDBドキュメントでサポートしてください。完全な情報を持っていなくても良い解決策を見つけ出すのは難しいです。 – Saleem

+0

サンプルで質問を更新しました。 'db.test.aggregate( { $グループ::{ _id: "$原点"、 }、 $グループ:{ _id: "$先"、 }私はこれを行うとき はあなたに – MAYA

答えて

1

ありがとうございます。

+0

ありがとう } は) ' 結果、2つのフィールド – MAYA

+0

ありがとうだけでなく、先によってグループです。それは非常に良い作品:) – MAYA

2

これは、カスタム書式設定をしたい非常に特殊なケースですので、あなたの最善の策は、MongoDBのの機能をマップ削減になります。しかし、このフォーマットは集約フレームワークの助けを借りて達成することもできます。私は両方のソリューションを追加しています。

集約フレームワーク:

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" 
    ] 
} 

地図削減:

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ご希望の結果が含まれています。