2015-08-18 11 views
31

Mam kolekcję MongoDB jak:MongoDB Jak zdobyć wartości max od zbiorów

db.kids.find() 
//results 
[ 
    {name:'tom', age:10}, 
    {name:'alice', age:12}, 
    .... 
] 

muszę zapytać, aby uzyskać 'wiek' MAX z tej kolekcji jak w SQL: SELECT MAX(age) FROM kids WHERE 1

+3

możliwe duplikat [MongoDB: znalezienie największej wartości liczbowej kolumny] (http://stackoverflow.com/questions/15072658/mongodb-finding-the-highest-numeric-value- of-a-column) – Yogesh

+1

możesz użyć 'db.collection.find(). sort ({age: -1}). limit (1)' – Vishwas

+0

dzięki. działa –

Odpowiedz

39

As one of comments:

db.collection.find().sort({age:-1}).limit(1) // for MAX 
db.collection.find().sort({age:+1}).limit(1) // for MIN 

to całkowicie użyteczny, ale nie jestem pewien, o wydajności

+3

W przypadku dużej kolekcji lepiej jest zdefiniować indeks w polu "wiek". Następnie, jeśli użyjesz 'db.collection.find ({}, {age: 1, _id: 0}). Sort ({age: -1}). Limit (1)', prawdopodobnie będziesz miał bardzo szybki [Objęte Zapytanie] (https://docs.mongodb.com/v3.0/core/query-optimization/#covered-query) –

6

co z użyciem kruszywa ramowa:

db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}}); 
+3

To nie jest tak skuteczne, jak sort.limit. Wiem jednak, że każdy czuje się dziwnie w tym rodzaju i limicie ... –

+0

@ AFP_555 Naprawdę zaskoczony, że agregacja jest wolniejsza niż zapytanie o sortowanie. Dzięki za udostępnienie! –

+0

jest agregatem wolniejszym niż zapytanie o sortowanie? – ashusvirus

17

Występ sugerowanej odpowiedź jest w porządku. Według MongoDB documentation:

Kiedy $ sort bezpośrednio poprzedza dolarów limitu, optymalizator może łączyć dolarów limitu do $ sort. Pozwala operację sortowania aby tylko utrzymać top n wynika, jak postępuje, gdzie n jest określona granica i MongoDB tylko musi przechowywać n pozycji w pamięci.

Tak więc w przypadku

db.collection.find().sort({age:-1}).limit(1) 

mamy tylko najwyższej elementu BEZ sortowania kolekcji z powodu wspomnianego optymalizacji.

1

proste wyjaśnienie, jeśli masz Mongo Zapytanie o odpowiedź coś jak poniżej - i chcesz tylko najwyższą wartość od Array-> "Data"

{ 
    "_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" 
    ], 
    "Date": [ 
    "2017-02-13T00:00:00.000Z", 
    "2017-03-05T00: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" 
    } 
    ], 

}, 

*** Następnie trzeba dodać

Latest_Wish_CreatedDate: {$ max: "$ Date"},

somthing jak below-

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

i końcowe Zapytanie o odpowiedź będzie poniżej

{ 
    "_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" 
}, 
0

Folks można zobaczyć, co robi optymalizator uruchamiając plan. Ogólny format zaglądania do planu pochodzi z MongoDB documentation. tj. Cursor.plan(). Jeśli naprawdę chcesz kopać głębiej, możesz zrobić kursorek.pl (true), aby uzyskać więcej szczegółów.

Powiedziawszy, że jeśli masz indeks, twoje db.col.find(). Sort ({"pole": - 1}) limit (1) odczyta jeden wpis indeksu - nawet jeśli indeks jest domyślny rosnąco i chciałeś mieć maksymalny wpis i jedną wartość z kolekcji.

Innymi słowy, sugestie z @yogesh są poprawne.

Dzięki - Sumit