4

文字列の配列を含むmongoドキュメントがあります。この特定の文字配列をキーと値のペアを含むオブジェクトの配列に変換する必要があります。以下は私のcurent appraochです。mongo配列をキーと値のペアを持つオブジェクトに変換する

{ 
    "_id" : ObjectId("57e3720836e36f63695a2ef2"), 
    "platform" : "A1", 
    "available" : { 
     "Community" : { 
      "attributes" : { 
       "type" : { 
        "values" : [ 
         "well-known", 
         "simple", 
         "complex" 
        ], 
        "defaultValue" : "well-known" 
       }, 
[......] 


} 

現在のクエリ:

templateAttributes.find({platform:"V1"}).map(function(c){ 
    //instantiate a new array 
    var optionsArray = []; 
for (var i=0;i< c['available']['Community']['attributes']['type']['values'].length; i++){ 
    optionsArray[i] = {};    // creates a new object 
    optionsArray[i].label = c['available']['Community']['attributes']['type']['values'][i]; 
    optionsArray[i].value = c['available']['Community']['attributes']['type']['values'][i]; 
    } 
    return optionsArray; 
})[0]; 

結果:

[{label:"well-known", value:"well-known"}, 
{label:"simple", value:"simple"}, 
{label:"complex", value:"complex"}] 

は十分に私のアプローチに効率的です、またはそれを得るために、上記のクエリを最適化する方法があります希望の結果?

+0

これはmongodb側で行う必要がある特定の理由は何ですか? –

+0

いいえ、それはmongo側で行う必要がある特別な理由はありません。私はMeteorでこれを使用しているので、このクエリはメモリ(mini-mongo)で実行されます。 – blueren

+0

@bluereen Ok。次に、集約が解決策です。 '$ unwind'は結果セットのサイズarray.length倍を掛けることに留意してください。したがって、 '$ project'を前に使用して、必要なフィールドを保持するだけです。おそらくは 'values'だけです。 –

答えて

3

のでわかりません。それにもかかわらず、集約フレームワーク を使用すると、$unwindオペレータを使用して埋め込み値配列を非正規化できます。つまり、配列エントリごとに各ドキュメントのコピーが生成されます。

値配列をフラット化した後、集計演算子の値に$groupの積算演算子を適用して集計できます。 $project演算子の最終パイプラインは、前のグループのフィールドを目的のフォーマットに整形します。

概念を取得するには、この例に従ってください:あなたは上記の集約パイプラインを実行できるように

templateAttributes.aggregate([ 
    { "$match": { "platform": "V1" } }, 
    { "$unwind": "$available.Community.attributes.type.values" }, 
    { 
     "$group": { 
      "_id": "$available.Community.attributes.type.values", 
      "value": { "$first": "$available.Community.attributes.type.values" } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "label": "$_id", 
      "value": 1 
     } 
    } 
]) 

あなたは流星を使用しているので、流星がmeteorhacks:aggregateを追加するには、流星のための適切な集約のサポートが追加されますあなたのコレクション。

+0

私はそれらをHTML メニューに渡すつもりです。ありがとう! – blueren

+1

クリスおかげさま。パッケージはサーバー側でしか動作しないので、私はまだパッケージと全体の集合クエリについて議論しています。それに加えて、私はオートフォームを使用していて、クライアント側のmongoクエリからドロップダウンデータを供給しています – blueren

3

ここで集計を使用してください。

db.templateAttributes.aggregate([ 
            {"$match":{platform:"A1"}}, {"$unwind": "$available.Community.attributes.type.values"}, 
            {$group: {"_id": null, "val":{"$push":{label:"$available.Community.attributes.type.values", 
                      value:"$available.Community.attributes.type.values"}}}} 
           ]).toArray()[0].val 

出力:あなたはキーと値がちょうど同じよう最終結果で何をしたいか

[ 
    { 
      "label" : "well-known", 
      "value" : "well-known" 
    }, 
    { 
      "label" : "simple", 
      "value" : "simple" 
    }, 
    { 
      "label" : "complex", 
      "value" : "complex" 
    } 
] 
+1

ありがとうございます。私はこれを一撃して元に戻す。 – blueren

0

使用クエリ

templateAttributes.aggregate([{ 
$match: { 
    "platform" : "A1" 
    }}, 
    { 
    $unwind: {path : "$available.Community.attributes.type.values"}},{ $group:{ 
    _id:"$_id", 
    result:{ 
     $push: { 
      label: "$available.Community.attributes.type.values", value: "$available.Community.attributes.type.values" 
      } 
     } 
    }}]) 

それはあなたの期待の答えを強要与えるでしょう。

関連する問題