2017-10-15 4 views
1

Je cette exigence, où j'ai une collection comme ci-dessous:Plus haute valeur des sous-réseaux dans les documents

{ 
     "_id" : 1, 
     "name" : "sam", 
     "Array" : [ 
      { "K" : "A", "V" : 8 }, 
      { "K" : "B", "V" : 5 }, 
      { "K" : "C", "V" : 13 } 
     ] 
}, 
{ 
    "_id" : 2, 
    "name" : "tom", 
    "Array" : [ 
     { "K" : "D", "V" : 12 }, 
     { "K" : "E", "V" : 14 }, 
     { "K" : "F", "V" : 2 } 
    ] 
}, 
{ 
    "_id" : 3, 
    "name" : "jim", 
    "Array" : [ 
     { "K" : "G", "V" : 9 }, 
     { "K" : "H", "V" : 4 }, 
     { "K" : "I", "V" : 2 } 
    ] 
} 

Je voudrais exécuter une requête qui renvoie le sous-document chaque _id avec le plus haut « V », donc dans ce cas, je recevrais:

{ "_id" : 1, "name" : "sam", "Array" : [ { "K" : "C", "V" : 13 } ] } 
{ "_id" : 2, "name" : "tom", "Array" : [ { "K" : "E", "V" : 14 } ] } 
{ "_id" : 3, "name" : "jim", "Array" : [ { "K" : "G", "V" : 9 } ] } 

Répondre

0

Vous utilisez peut sélectionner uniquement les sous-documents où la valeur du champ V est égale à la valeur maximale dans le tableau en utilisant $filter et l'opérateur $max.

L'étape de pipeline $addFields est utilisée ici pour spécifier tous les autres champs du document.

db.collection.aggregate([ 
    { 
     "$addFields":{ 
     "Array":{ 
      "$filter":{ 
       "input":"$Array", 
       "cond":{ 
        "$eq":[ 
        "$$this.V", 
        { 
         "$max":"$Array.V" 
        } 
        ] 
       } 
      } 
     } 
     } 
    } 
])