2017-09-13 14 views
0

私はここで、jsonの場合、最も低い値の命題を持つ各アイテムのみを返すロジックを考えています。あなたがこれを行うために最短の方法としてはMongoDB 3.4で$indexOfArrayを使用して実装するのいずれか内側の配列から最も低い値を持つ各アイテムを返す

{ 
requester: "test", 
orderitems: [ 
       { 
        description: "testitem1", 
        proposals: [ 
           { 
            company: "company1", 
            value: 10 
           }, 
           { 
            company: "company2", 
            value: 5 
           } 
        ] 
       } 
] 
} 

答えて

0

ご利用できるのMongoDBサーバーのバージョンに応じて

db.getCollection('collection').aggregate([ 
    { "$addFields": { 
    "orderitems": { 
     "$map": { 
     "input": "$orderitems", 
     "as": "o", 
     "in": { 
      "description": "$$o.description", 
      "proposals": { 
      "$arrayElemAt": [ 
       "$$o.proposals", 
       { "$indexOfArray": [ 
       "$$o.proposals.value", 
       { "$min": "$$o.proposals.value" } 
       ]} 
      ]  
      } 
     } 
     } 
    } 
    }} 
]) 

それともMongoDBを3.2とすることができます$filterをし、最初の一致要素を$arrayElemAtとする:

db.getCollection('collection').aggregate([ 
    { "$addFields": { 
    "orderitems": { 
     "$map": { 
     "input": "$orderitems", 
     "as": "o", 
     "in": { 
      "description": "$$o.description", 
      "proposals": { 
      "$arrayElemAt": [ 
       { "$filter": { 
       "input": "$$o.proposals", 
       "cond": { "$eq": ["$$this.value",{ "$min": "$$o.proposals.value" }] } 
       }}, 
       0 
      ]  
      } 
     } 
     } 
    } 
    }} 
]) 

そしてそれよりも低いバージョンであれば正直に試して実装するのは苦労でしょう。

本質的な原則は、$minによって返された値に基づいたマッチングであり、MongoDB 3.2では変更が行われたため、「アキュムレータ」としてではなく値の任意の配列から「最小値」を返すことができますバージョン3.2で変更凝集の$group

:$分$グループと$プロジェクトの段階で使用可能です。 MongoDBの以前のバージョンでは、$ minは$ groupステージでのみ利用可能です。

だから一般的なケースでは、我々は$indexOfArrayのマッチング・インデックスから、または$filterの配列エントリに一致として返される何のいずれかによって返される値によって配列エントリと一致しています。

「マッチしたインデックス」は$arrayElemAtに供給され、そのインデックスの配列値が抽出されます。または0インデックスが「フィルタリングされたリスト」の「最初の」要素を取得するために使用されます。

どちらのアプローチが返されます。

{ 
    "requester" : "test", 
    "orderitems" : [ 
     { 
      "description" : "testitem1", 
      "proposals" : { 
       "company" : "company2", 
       "value" : 5.0 
      } 
     } 
    ] 
} 
関連する問題