У меня есть коллекция mongodb, например:
db.kids.find()
//results
[
{name:'tom', age:10},
{name:'alice', age:12},
....
]
Мне нужен запрос, чтобы получить MAX 'age' из этой коллекции
как в SQL: SELECT MAX(age) FROM kids WHERE 1
У меня есть коллекция mongodb, например:
db.kids.find()
//results
[
{name:'tom', age:10},
{name:'alice', age:12},
....
]
Мне нужен запрос, чтобы получить MAX 'age' из этой коллекции
как в SQL: SELECT MAX(age) FROM kids WHERE 1
db.collection.find().sort({age:-1}).limit(1) // for MAX
db.collection.find().sort({age:+1}).limit(1) // for MIN
он полностью полезен, но я не уверен в производительности
Выполнение предложенного ответа в порядке. Согласно документации MongoDB:
Когда $ sort непосредственно предшествует $ limit, оптимизатор может объединить $ limit в $ sort. Это позволяет операцию сортировки поддерживать только лучшие n результатов по мере продвижения, где n указанное ограничение, и MongoDB нужно только хранить n элементов в память.
Изменено в версии 4.0.
Так и в случае с
db.collection.find().sort({age:-1}).limit(1)
мы получаем только самый высокий элемент БЕЗ сортировки коллекции из-за упомянутой оптимизации.
как использовать встроенную структуру:
db.collection.aggregate({ $group : { _id: null, max: { $max : "$age" }}});
Люди вы можете видеть, что делает оптимизатор, запустив план. Общий формат просмотра плана - это документация MongoDB . т.е. Cursor.plan(). Если вы действительно хотите копать глубже, вы можете сделать cursor.plan(true) для более подробной информации.
Сказав, что если у вас есть индекс, ваш db.col.find(). sort ({ "field": - 1}). limit (1) будет читать одну запись индекса - даже если индекс по умолчанию возрастает и вам нужна максимальная запись и одно значение из коллекции.
Другими словами, предложения от @yogesh верны.
Спасибо - Сумит
Вы можете использовать группу и макс:
db.getCollection('kids').aggregate([
{
$group: {
_id: null,
maxQuantity: {$max: "$age"}
}
}
])
Простое объяснение, если у вас есть запрос ответа mongo что-то вроде ниже - и вы хотите получить только самое высокое значение от Массив- > "Дата"
{
"_id": "57ee5a708e117c754915a2a2",
"TotalWishs": 3,
"Events": [
"57f805c866bf62f12edb8024"
],
"wish": [
"Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)",
"Asics Men 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"
}
],
},
*** Затем вы добавили
Latest_Wish_CreatedDate: {$ max: "$ Date" },
somthing, как показано ниже -
{
$project : { _id: 1,
TotalWishs : 1 ,
wish:1 ,
Events:1,
Wish_CreatedDate:1,
Latest_Wish_CreatedDate: { $max: "$Date"},
}
}
И окончательный ответ на запрос будет ниже
{
"_id": "57ee5a708e117c754915a2a2",
"TotalWishs": 3,
"Events": [
"57f805c866bf62f12edb8024"
],
"wish": [
"Cosmic Eldorado Mountain Bikes, 26-inch (Grey/White)",
"Asics Men 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"
},
Для максимального значения мы можем написать SQL-запрос как
select age from table_name order by age desc limit 1
Точно так же мы можем писать и в mongodb.
db.getCollection('collection_name').find().sort({"age" : -1}).limit(1); //max age
db.getCollection('collection_name').find().sort({"age" : 1}).limit(1); //min age