ご利用できるの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
}
}
]
}