2017-09-13 5 views

Répondre

0

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 
      } 
     } 
    ] 
}