Получение количества элементов с помощью драйвера запросов MongoDB C # - PullRequest
9 голосов
/ 16 февраля 2012

Используя драйвер c # для MongoDB, я могу легко создать запрос, по которому я могу добавить параметры SetSkip () и SetLimit (), чтобы ограничить результирующий набор определенным размером.

Однако я хотел бы знать, сколько элементов запроса будет перед применением Skip and Take без выполнения запроса и загрузки всего набора результатов (который может быть огромным) в память .

Похоже, я могу сделать это с MongoDB напрямую через оболочку с помощью команды count (). e.g.:

 db.item.find( { "FieldToMatch" : "ValueToMatch" } ).count()

Который просто возвращает целое число, и это именно то, что я хочу. Но я не вижу способа в документации сделать это через драйвер C #. Возможно ли это?

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

Cheers, Matt

Ответы [ 2 ]

15 голосов
/ 16 февраля 2012

Вы можете сделать это так:

var server = MongoServer.Create("mongodb://localhost:27020");
var database = server.GetDatabase("someDb");

var collection = database.GetCollection<Type>("item");
var cursor = collection.Find(Query.EQ("FieldToMatch" : "ValueToMatch"));

var count = cursor.Count(); 

Некоторые заметки:

  1. У вас должен быть только один экземпляр сервера (singleton)
  2. последняя версия драйвера фактически возвращает длинное число вместо int
  3. Курсор извлекает данные только после итерации
  4. Вы можете настроить множество вещей, таких как пропустить, взять, указать поля для возврата в курсоре до фактической загрузки данных (запуск итерации)
  5. Метод Count () для курсора загружает только количество документов
1 голос
/ 05 октября 2016

Я использую драйвер 2.3.0, и теперь также возможно сделать это так:

...
IMongoCollection<entity> Collection = db.GetCollection<entity>(CollectionName);
var yourFilter = Builders<entity>.Filter.Where(o => o.prop == value);
long countResut = Collection.Count(yourFilter);
...