2016-07-07 6 views
5

私が持っているもの:を連結配列要素

{ "_id" : ObjectId("577dc9d61a0b7e0a40499f90"), "equ" : 123456, "key" : "p" } 
{ "_id" : ObjectId("577c789b1a0b7e0a403f1b52"), "equ" : 123456, "key" : "r" } 
{ "_id" : ObjectId("577b27481a0b7e0a4033965a"), "equ" : 123456, "key" : "r" } 
{ "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), "equ" : 123456, "key" : "o" } 

は、私が欲しいもの:私が試した何

{ "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), "equ" : 123456, "keys" : "prro" } 

db.table.aggregate([{"$group":{"_id":0, "keys":{"$push":"$key"}}}]) arrを返すいいえ、文字列ではありません:

{"_id":0, "keys":["p","r","r","o"]} 

ご存知ですか?

+0

がなぜあなたに望ましい結果を与えるだろう

var project = { $project: { equ: "$_id", _id: "$last", keys: { $reduce: { input: "$keys", initialValue: "", in: {$concat: ["$$value", "$$this"]} } } } } 

は、これら2つのパイプライン動作を適用する:配列の要素を結合するための新しい$reduce演算子を使用することができます'ObjectId(" 5779d6111a0b7e0a40282dc7 ")'を選択しますか?それは最後のものなので? –

+0

ObjectIdを考慮しないでください。私はイドについて気にしない、equとキーだけが重要です。 – hotips

+1

それで最後のIDを維持し、それを投影する必要はありません。 –

答えて

9

TL; DR

使用この集約パイプラインを:

db.col.aggregate([ 
    {$group: {_id: "$equ", last: {$last: "$_id"}, keys: {$push: "$key"}}}, 
    { 
     $project: { 
      equ: "$_id", 
      _id: "$last", 
      keys: { 
       $reduce: { 
        input: "$keys", 
        initialValue: "", 
        in: {$concat: ["$$value", "$$this"]} 
       } 
      } 
     } 
    } 
]) 

詳細

まずあなたがequ値に基づいて文書をgroupともlast group member_idと一緒にarray of keysを維持する必要があります。

var groupByEqu = { 
    $group: { 
     _id: "$equ", 
     last: {$last: "$_id"}, 
     keys: {$push: "$key"} 
    } 
} 
{ 
    "_id" : 123456, 
    "last" : ObjectId("5779d6111a0b7e0a40282dc7"), 
    "keys" : [ "p", "r", "r", "o" ] 
} 

あなたはプロジェクションご希望の方に前の文書を変換するために使用する必要があります:はちょうどこのパイプライン動作がにつながる適用します。最初の2つの変換は簡単です。

db.col.aggregate([groupByEqu, project]) 

です:

{ 
    "equ" : 123456, 
    "_id" : ObjectId("5779d6111a0b7e0a40282dc7"), 
    "keys" : "prro" 
} 
関連する問題