2013-02-15 17 views
6

Let dire che ho della collezione:Finding valore più alto da sotto-array nei documenti

{ _id: 1, Array: [ 
    { K: "A", V: 8 }, 
    { K: "B", V: 5 }, 
    { K: "C", V: 13 } ] } 

{ _id: 2, Array: [ 
    { K: "D", V: 12 }, 
    { K: "E", V: 14 }, 
    { K: "F", V: 2 } ] } 

Vorrei eseguire una query che restituisce il sub-documento con il più alto "V", quindi in questo caso vorrei avere:

{ _id: 1, Array: [ { K: "E", V: 14 } ] } 

o semplicemente:

{ K: "E", V: 14 } 

la parte importante è che io voglio l'utilizzo della memoria sul Mong o il server deve essere O (1) (indipendentemente dal numero di documenti che elabora, l'utilizzo della memoria è costante) e voglio solo recuperare quel documento secondario con il valore che mi serve (non voglio scaricare più documenti secondari del necessario).

Il mio approccio preferito sarebbe utilizzare una query di ricerca semplice, ma non sono sicuro che sia possibile. Sospetto che ciò possa essere fatto anche con la struttura di aggregazione (o la mappa di riduzione?), Ma non vediamo come. Non voglio che il risultato venga archiviato in una raccolta temporanea, ma direttamente restituito al mio cliente (come una normale query).

+0

Non si può fare con un ritrovamento, ma si dovrebbe essere in grado di con il quadro di aggregazione. – JohnnyHK

+0

Sono bloccato su come comprimere tutti gli elementi da matrice in un singolo documento secondario. – Flavien

+0

Dai un'occhiata a ['$ unwind'] (http://docs.mongodb.org/manual/reference/aggregation/unwind/#_S_unwind). – JohnnyHK

risposta

5

Il seguente set di agitazione restituisce quello che ti serve.

db.letters.aggregate([ 
    {$project:{"Array.K":1, "Array.V":1}}, 
    {$unwind:"$Array"}, 
    {$sort:{"Array.V":-1}}, 
    {$limit:1} 
]); 

Returns:

{"_id":2, "Array":{"K":"E","V":14}} 

Enjoy! :)

2

Come @JohnnyHK detto:

db.col.aggregate([ 
    {$unwind: '$Array'}, 
    {$group: {_id: '$_id', Array: {K: {$max: '$K'}, V: {$max: '$V'}}}} 
]) 

Qualcosa del genere.

0

in parole semplici, se avete mongo di risposta alle query qualcosa di simile qui sotto - e si desidera solo valore più alto da nell'edificio-> "Wish_CreatedDate"

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Wish_CreatedDate": [ 
    "2017-03-05T00:00:00.000Z", 
    "2017-02-13T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 

}, 

** * Poi hai aggiunto

Ultimate_Wish_CreatedDate: {$ max: "$ Wish_CreatedDate"},

somthing come sotto-

{ 
       $project : { _id: 1, 
          TotalWishs : 1 , 
           wish:1 , 
           Events:1, 
           Wish_CreatedDate:1, 
           Latest_Wish_CreatedDate: { $max: "$Wish_CreatedDate"}, 
          } 
      } 

E Richiesta di risposta finale sarà inferiore

{ 
    "_id": "57ee5a708e117c754915a2a2", 
    "TotalWishs": 3, 
    "Events": [ 
    "57f805c866bf62f12edb8024" 
    ], 
    "wish": [ 
    "Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)", 
    "Asics Men's Gel-Nimbus 18 Black, Snow and Fiery Red Running Shoes - 10 UK/India (45 EU) (11 US)", 
    "Suunto Digital Black Dial Unisex Watch - SS018734000" 
    ], 
    "Wish_CreatedDate": [ 
    "2017-03-05T00:00:00.000Z", 
    "2017-02-13T00:00:00.000Z" 
    ], 
    "UserDetails": [ 
    { 
     "createdAt": "2016-09-30T12:28:32.773Z", 
     "jeenesFriends": [ 
     "57edf8a96ad8f6ff453a384a", 
     "57ee516c8e117c754915a26b", 
     "58a1644b6c91d2af783770b0", 
     "57ef4631b97d81824cf54795" 
     ], 
     "userImage": "user_profile/Male.png", 
     "email": "[email protected]", 
     "fullName": "Roopak Kapoor" 
    } 
    ], 
    "Latest_Wish_CreatedDate": "2017-03-05T00:00:00.000Z" 
}, 
Problemi correlati