Агрегатные функции

Последнее обновление: 29.07.2022

Число элементов в коллекции

С помощью функции countDocuments() можно получить общее количество документов в коллекции:

db.users.countDocuments()

Если нам надо узнать не совокупное количество документов в коллекции, а только количество документов в конкретной выборке, то можно применять функцию count(). Например, подсчитаем количество документов, у которых name=Tom:

db.users.find({name: "Tom"}).count()

Более того мы можем создавать цепочки функций, чтобы конкретизировать условия подсчета:

db.users.find({name: "Tom"}).skip(2).count(true)

Здесь надо отметить, что по умолчанию функция count не используется с функциями limit и skip. Чтобы их использовать, как в примере выше, в функцию count надо передать булевое значение true

Функция distinct

В коллекции могут быть документы, которые содержат одинаковые значения для одного или нескольких полей. Например, в нескольких документах определено name: "Tom". И нам надо найти только уникальные различающиеся значения для одного из полей документа. Для этого мы можем воспользоваться функцией distinct. Например, пусть в базу данных добавлены следующие документы:

db.users.insertOne({"name": "Tom", "age": 38, languages: ["english", "spanish"]})
db.users.insertOne({"name": "Bob", "age": 41, languages: ["english", "french"]})
db.users.insertOne({"name": "Sam", "age": 28, languages: ["english"]})
db.users.insertOne({"name": "Tom", "age": 22, languages: ["english", "german"]})

Выведем все уникальные значения по полю "name":

test> db.users.distinct("name")
[ 'Bob', 'Sam', 'Tom' ]
test>

Функции min и max

Функции min и max устанавливает для определенного поля минимальное значение для попадания в выборку. При этом данные функции могут использовать только те поля, для которых установлены индексы. Например, возьмем выше опеределенную коллекцию db.users и определим в ней индекс для поля age:

db.users.createIndex({"age": 1})

При выполнении функции также надо использовать функцию hint(), в которую передается индекс. Например, выберем все документы, в которых поле age больше 30:

test> db.users.find().min({age:30}).hint({age:1})
[
  {
    _id: ObjectId("62e3d63a79a0a7792a9de210"),
    name: 'Tom',
    age: 38,
    languages: [ 'english', 'spanish' ]
  },
  {
    _id: ObjectId("62e3d63a79a0a7792a9de211"),
    name: 'Bob',
    age: 41,
    languages: [ 'english', 'french' ]
  }
]
test>

Аналогичным образом работает функция max(), которая устанавливает максимальное значение. Например, выберем документы, где age меньше 30:

test> db.users.find().max({age:30}).hint({age:1})
[
  {
    _id: ObjectId("62e3d64079a0a7792a9de213"),
    name: 'Tom',
    age: 22,
    languages: [ 'english', 'german' ]
  },
  {
    _id: ObjectId("62e3d63a79a0a7792a9de212"),
    name: 'Sam',
    age: 28,
    languages: [ 'english' ]
  }
]
test>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850