Ich habe eine Mongodb-Sammlung wie:
db.kids.find()
//results
[
{name:'tom', age:10},
{name:'alice', age:12},
....
]
Ich benötige eine Abfrage, um MAX 'Alter' aus dieser Sammlung wie in SQL zu erhalten: SELECT MAX(age) FROM kids WHERE 1
db.collection.find().sort({age:-1}).limit(1)
Antworten:
Als einer der Kommentare :
db.collection.find().sort({age:-1}).limit(1) // for MAX db.collection.find().sort({age:+1}).limit(1) // for MIN
Es ist vollständig verwendbar, aber ich bin mir nicht sicher über die Leistung
quelle
age
Feld zu definieren . Wenn Sie dann verwendendb.collection.find({}, {age: 1, _id:0}).sort({age:-1}).limit(1)
, hätten Sie wahrscheinlich eine sehr schnelle Covered QueryDie Leistung der vorgeschlagenen Antwort ist in Ordnung. Laut MongoDB-Dokumentation :
Also im Fall von
db.collection.find().sort({age:-1}).limit(1)
Aufgrund der genannten Optimierung erhalten wir nur das höchste Element, OHNE die Sammlung zu sortieren.
quelle
find( ... ).sort( ... ).limit( ... )
es genauso behandelt wird wieaggregate([{$match: ... }, {$sort: ...}, {$limit: ...}])
? Gibt es irgendwo in den Mongo-Dokumenten einen Ort, an dem sie dies erwähnen?Was ist mit der Verwendung eines aggregierten Frameworks?
db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}});
quelle
Sie können group und max verwenden:
db.getCollection('kids').aggregate([ { $group: { _id: null, maxQuantity: {$max: "$age"} } } ])
quelle
Leute, Sie können sehen, was der Optimierer tut, indem Sie einen Plan ausführen. Das generische Format für die Prüfung eines Plans stammt aus der MongoDB- Dokumentation . dh Cursor.plan (). Wenn Sie wirklich tiefer graben möchten, können Sie einen cursor.plan (true) für weitere Details ausführen.
Wenn Sie jedoch einen Index haben, liest Ihre Datei db.col.find (). Sort ({"field": - 1}). Limit (1) einen Indexeintrag - auch wenn der Index standardmäßig aufsteigend ist und Sie dies wollten der maximale Eintrag und ein Wert aus der Sammlung.
Mit anderen Worten, die Vorschläge von @yogesh sind korrekt.
Danke - Sumit
quelle
db.collection.findOne().sort({age:-1}) //get Max without need for limit(1)
quelle
TypeError: db.collection.findOne(...).sort is not a function
. collection.findOne () gibt das Dokument selbst zurück, sodass es unwahrscheinlich ist, dass sort () darauf aufgerufen wird.Einfache Erklärung, wenn Sie eine Mongo-Abfrage Antwort wie unten haben - und Sie nur den höchsten Wert von Array-> "Datum" wollen.
{ "_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" } ], },
*** Dann hast du hinzugefügt
so etwas wie unten-
{ $project : { _id: 1, TotalWishs : 1 , wish:1 , Events:1, Wish_CreatedDate:1, Latest_Wish_CreatedDate: { $max: "$Date"}, } }
Die endgültige Antwort auf die Abfrage finden Sie weiter unten
{ "_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" },
quelle
Für den Maximalwert können wir eine SQL-Abfrage als schreiben
select age from table_name order by age desc limit 1
Ebenso können wir auch in Mongodb schreiben.
db.getCollection('collection_name').find().sort({"age" : -1}).limit(1); //max age db.getCollection('collection_name').find().sort({"age" : 1}).limit(1); //min age
quelle
Sie können dies auch durch eine aggregierte Pipeline erreichen.
db.collection.aggregate([{$sort:{age:-1}}, {$limit:1}])
quelle
O(n)
zu erzielen kostet immer ohne Angaben. Dies hat eine Leistung vonO(n log(n))