Итак, у меня есть куча документов в коллекции MongoDB, и кажется, что коллекция растет немного быстрее, чем мы думали.

Есть ли способ получить список из коллекции, которая будет подсчитывать количество документов, которые имеют значение X в поле.

Я просто сделаю некоторые данные для примера:

Для reference на поле возможны 4 значения:

  1. /content/public
  2. /content/private
  3. /resource/something
  4. /much/wow

Есть ли способ получить список от Монго, который говорит:

  • 1231 Записи имеют /content/public в качестве значения для справки.
  • 21312312 есть /content/private .
  • 34 есть /resource/something .
  • 34242 есть /much/wow .

1 ответ1

0

Есть несколько различных способов сделать это, подход грубой силы должен был бы сделать запрос для каждого отдельного значения, о котором вы знаете, и просто вызвать .count() следующим образом:

db.collection.find({field : '/content/public'}).count()
db.collection.find({field : '/content/private'}).count()
etc.

Но это означает, что вам нужно перебирать список известных полей и выполнять несколько разных запросов. Тем не менее, это может быть хорошо для выборочной проверки.

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

db.collection.aggregate( { $group : { _id : "$field", count : { $sum : 1 } } })

Вот общий пример с составленными данными. Сначала сами данные:

> db.foo.find()
{ "_id" : ObjectId("547ccf922bd17c324ae52b6e"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf932bd17c324ae52b6f"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf942bd17c324ae52b70"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf942bd17c324ae52b71"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf952bd17c324ae52b72"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf962bd17c324ae52b73"), "countField" : "/content/public" }
{ "_id" : ObjectId("547ccf9b2bd17c324ae52b74"), "countField" : "/content/private" }
{ "_id" : ObjectId("547ccf9d2bd17c324ae52b75"), "countField" : "/content/private" }
{ "_id" : ObjectId("547ccfa42bd17c324ae52b76"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa52bd17c324ae52b77"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa62bd17c324ae52b78"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa72bd17c324ae52b79"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa72bd17c324ae52b7a"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfa82bd17c324ae52b7b"), "countField" : "randomvalue" }
{ "_id" : ObjectId("547ccfb52bd17c324ae52b7c"), "countField" : "/much/wow" }

Теперь образец агрегации:

> db.foo.aggregate({ $group : { _id : "$countField", count : { $sum : 1 } } })
{ "_id" : "/much/wow", "count" : 1 }
{ "_id" : "randomvalue", "count" : 6 }
{ "_id" : "/content/private", "count" : 2 }
{ "_id" : "/content/public", "count" : 6 }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .