Подтвердить что ты не робот

Mongodb как получить максимальное значение из коллекций

У меня есть коллекция mongodb, например:

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

Мне нужен запрос, чтобы получить MAX 'age' из этой коллекции как в SQL: SELECT MAX(age) FROM kids WHERE 1

4b9b3361

Ответ 1

Как один из комментариев:

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

он полностью полезен, но я не уверен в производительности

Ответ 2

Выполнение предложенного ответа в порядке. Согласно документации MongoDB:

Когда $ sort непосредственно предшествует $ limit, оптимизатор может объединить $ limit в $ sort. Это позволяет операцию сортировки поддерживать только лучшие n результатов по мере продвижения, где n указанное ограничение, и MongoDB нужно только хранить n элементов в память.

Изменено в версии 4.0.

Так и в случае с

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

мы получаем только самый высокий элемент БЕЗ сортировки коллекции из-за упомянутой оптимизации.

Ответ 3

как использовать встроенную структуру:

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

Ответ 4

Люди вы можете видеть, что делает оптимизатор, запустив план. Общий формат просмотра плана - это документация MongoDB . т.е. Cursor.plan(). Если вы действительно хотите копать глубже, вы можете сделать cursor.plan(true) для более подробной информации.

Сказав, что если у вас есть индекс, ваш db.col.find(). sort ({ "field": - 1}). limit (1) будет читать одну запись индекса - даже если индекс по умолчанию возрастает и вам нужна максимальная запись и одно значение из коллекции.

Другими словами, предложения от @yogesh верны.

Спасибо - Сумит

Ответ 5

Вы можете использовать группу и макс:

db.getCollection('kids').aggregate([
    {
        $group: {
            _id: null,
            maxQuantity: {$max: "$age"}
        }
    }
])

Ответ 6

Простое объяснение, если у вас есть запрос ответа 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"
},

Ответ 7

Для максимального значения мы можем написать 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