2017-06-07 3 views
0

私はmongoドキュメントを別のドキュメントに投影しようとしています。値がフィールド "v"のオブジェクトに格納されている場所の下の文書を考えてみましょう。私はそれらの価値をより高いレベルに戻したいと考えています。私は以下の投影jsonでほとんどのフィールドを行う方法を知っています。しかし、要素が実際に値であり、名前が設定されていないdtone領域の投影jsonを理解することはできません。だから私はどのように値を投影するのですか?サブプロジェクト名が値であるmongoパイプラインでのプロジェクト方法

{ 
    "_id" : "58e7a9d4418bcb55804d5756", 
    "fullName" : { 
     "v" : "Julie Johnson", 
     "tags" : [ "C" ] 
    }, 
    "guid" : { 
     "v" : "21d5a58c-39fb-489b-8d3a-46729ab387e2", 
     "tags" : [ "U", "C"] 
    }, 
    "dtones" : { 
     "20170301" : { 
      "tone" : { 
       "v" : 1.37947514772332, 
       "tags" : ["U"] 
      }, 
      "plus" : { 
       "v" : 3.39437782412235, 
       "tags" : ["U", "C"] 
      } 
     }, 
     "20170302" : { 
      "tone" : { 
       "v" : 1.14849248571483, 
       "tags" : ["U"] 
      }, 
      "plus" : { 
       "v" : 2.51859894690038, 
       "tags" : ["U", "C"] 
      } 
     } 
    } 
} 

所望の文書には、次のとおりです。

{ 
    "_id" : "58e7a9d4418bcb55804d5756", 
    "fullName" : "Julie Johnson", 
    "guid" : "21d5a58c-39fb-489b-8d3a-46729ab387e2", 
    "dtones" : { 
     "20170301" : { 
      "tone" : 1.37947514772332, 
      "plus" : 3.39437782412235 
     }, 
     "20170302" : { 
      "tone" : 1.14849248571483, 
      "plus" : 2.51859894690038 
     } 
    } 
} 

マイプロジェクトJSONは

{ 
    "_id": 1, 
    "fullName": "$fullName.v", 
    "guid": "$guid.v", 
    "dtones": <--- what goes here to map the variable element names 
} 

のように見え、私の.NETパイプラインのコードは次のようになります。

pipeline = collection.Aggregate() 
      .AppendStage<BsonDocument>(matchJson) 
      .AppendStage<BsonDocument>(redactJson) 
      .AppendStage<BsonDocument>(projectionJson); 

答えて

0

あなたは試すことができます集約パイプライン以下3.4.4バージョン。

変更キー値(k v)ラベルtoneplus値をマッピングする$unwind続い$objectToArray$addFieldsを使用してペアと$groupのアレイにdtones埋め込み文書は、埋め込まれた文書を作成する$arrayToObject$addFields続い埋め込みアレイに戻しdtonesを変更します。

db.collection.aggregate(
{$project:{dtones:{$objectToArray:"$dtones"}}}, 
{$unwind:"$dtones"}, 
{$addFields:{"dtones.v.tone":"$dtones.v.tone.v", "dtones.v.plus":"$dtones.v.plus.v" }}, 
{$group:{_id:"$_id", dtones:{$push:"$dtones"}}}, 
{$addFields:{dtones:{$arrayToObject:"$dtones"}}} 
) 
+0

ありがとうございました。私はまた、ドキュメントを修正してから、アプリケーションが期待するものにそれを投影することも考えています – KenB

関連する問題