En fonction de votre version disponible du serveur MongoDB:
Vous pouvez soit mettre en œuvre à l'aide $indexOfArray
avec MongoDB 3.4 comme le plus court chemin à faire:
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" }
]}
]
}
}
}
}
}}
])
Ou avec MongoDB 3.2, vous pouvez $filter
et prendre le premier élément correspondant avec $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
]
}
}
}
}
}}
])
Et honnêtement ce serait une peine à essayer et à implémenter dans n'importe quelle version inférieure à cela. Le principe essentiel est l'appariement basé sur la valeur retournée par $min
, qui a obtenu un changement dans MongoDB 3.2 afin qu'il puisse être utilisé pour renvoyer la valeur "minimum" de tout tableau de valeurs plutôt que simplement comme un "accumulateur" dans l'agrégation $group
Changé dans la version 3.2: min $ est disponible dans les étapes de groupe $ et projet $. Dans les versions précédentes de MongoDB, $ min est disponible uniquement dans l'étape $ group.
Ainsi, le cas général est que nous correspondre à l'entrée du tableau de la valeur retournée soit de l'indice correspondant de $indexOfArray
ou par tout ce qui est retourné comme correspondant à des entrées de tableau de $filter
. En fonction de la méthode choisie, l'index apparié est envoyé à $arrayElemAt
pour extraire la valeur du tableau à cet index, ou l'index 0
est utilisé pour obtenir le "premier" élément de la "liste filtrée".
retourne approche Soit:
{
"requester" : "test",
"orderitems" : [
{
"description" : "testitem1",
"proposals" : {
"company" : "company2",
"value" : 5.0
}
}
]
}