2017-01-17 16 views
0

チームjson配列のドキュメントを1つのjsonドキュメントに変換する

私はmongodbをスプリングデータとともに使用しています。

私はmongodbから集計(グループ)によっていくつかの結果を得ました。

{ "count" : 8, "SERVICE" : "ABC", "BUCKET" : "1", "TIME" : "16100106" } 
{ "count" : 8, "SERVICE" : "ABC", "BUCKET" : "1", "TIME" : "16100107" } 
{ "count" : 8, "SERVICE" : "ABC", "BUCKET" : "2", "TIME" : "16100108" } 
{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "1", "TIME" : "16100106" } 
{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "1", "TIME" : "16100107" } 
{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "2", "TIME" : "16100108" } 

TO:今、私はFROM

以下のような単一のJSON文書にJSON配列により、マルチライングループを変換したい

{ 
    "ABC" : {      //SERVICE 
      1: {     //BUCKET 
       16100106 : 8,  //TIME:count 
       16100107 : 8 
      }, 
      2: { 
       16100108 : 8 
      }, 
     }, 
    "XYZ" : { 
      1: { 
       16100106 : 10, 
       16100107 : 10 
      }, 
      2: { 
       16100108 : 10 
      }, 
     } 

} 

複雑さ

  1. を列の数が変更されます(新しい列の追加$ GROUPBY/$プロジェクト)

  2. が順番に合格することができるはずですが、現在の例では、

    SERVICE --> BUCKET --> TIME --> countなどのため、

    を示したが、これは

    TIME --> BUCKET --> SERVICE --> count

  3. のように変更する必要があります

これをサポートする汎用ライブラリを探していますか?または任意の提案?

答えて

0

私はスタックオーバーフローを使用するために新しいです、私はanwserを得るために私の考えを貢献してうれしいです。

それはMongoDBのをどのように動作するか私は知りませんが、あなたがのNode.jsを使用している場合、あなたはこの

var arrGroup = [ 
    { "count" : 8, "SERVICE" : "ABC", "BUCKET" : "1", "TIME" : "16100106" } 
    ,{ "count" : 8, "SERVICE" : "ABC", "BUCKET" : "1", "TIME" : "16100107" } 
    ,{ "count" : 8, "SERVICE" : "ABC", "BUCKET" : "2", "TIME" : "16100108" } 
    ,{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "1", "TIME" : "16100106" } 
    ,{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "1", "TIME" : "16100107" } 
    ,{ "count" : 10, "SERVICE" : "XYZ", "BUCKET" : "2", "TIME" : "16100108" } 
] 

var singleGroup = arrGroup.converGroupToSingle() 
のように、それをこの

Array.prototype.converGroupToSingle = function(){ 
    var r = {} 
    this.forEach(function(s){ 
     //not have SERVICE 
     ;(r[s.SERVICE] || (r[s.SERVICE] = {[s.BUCKET]:{[s.TIME]:s.count}},false)) 
     //have SERIVCE 
     && (
      // not have BUCKET 
      (r[s.SERVICE][s.BUCKET] || (r[s.SERVICE][s.BUCKET] = {[s.TIME]:s.count},false)) 
      //have BUKCET but not have TIME 
      && (r[s.SERVICE][s.BUCKET][s.TIME] || (r[s.SERVICE][s.BUCKET][s.TIME] = s.count,false)) 
     ) 
    }) 
    return r 
} 

のように、アレイで機能を拡張し、使用することができます

singleGroupあなたが出力場合、この

// the singleGroup 
{ 
ABC: 
    { 
     '1': { '16100106': 8, '16100107': 8 }, 
     '2': { '16100108': 8 } 
    }, 
XYZ: 
    { 
     '1': { '16100106': 10, '16100107': 10 }, 
     '2': { '16100108': 10 } 
    } 
} 

のような、それはあなたを助けることができる願っています。

ありがとうございました。

+0

ありがとうございました。フォーラムへようこそ。 –

関連する問題