MongoDB как проверить на существование - PullRequest
13 голосов
/ 20 июня 2011

Я хотел бы знать, как я могу проверить существование объекта с помощью mongoDB и C #.

Я нашел способ сделать это, но мне пришлось использовать Linq благодаря методу Any (),но я хотел бы знать, возможно ли это сделать без Linq?

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Any()

Спасибо, ребята!

Ответы [ 6 ]

16 голосов
/ 20 июня 2011

Используйте оператор $ count , чтобы избежать проблем с памятью, он не загружает документы из базы данных в память:

int count = items.FindAs<LedgerDocument>(Query.EQ("name", appName)).Count();

if(count > 0)
{
   //then doc exists
}

Оператор $ существует в mongodb можно использоватьчтобы определить, что какое-то поле существует в документе, но вы не можете передать ему запрос:

database.GetCollection<ApplicationViewModel>("Applications")
                  .Find(Query.Exists("Name", true));
5 голосов
/ 25 июля 2014

Самый простой, безопасный для типа / рефактора вариант - использовать LINQ* с AsQueryable:

var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().Any(avm => avm.Name == applicationName);

Это создаст команду подсчета и проверит, что она выше нуля.

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

var collection = database.GetCollection<ApplicationViewModel>("Applications");
var exists = collection.AsQueryable().FirstOrDefault(avm => avm.Name == applicationName) != null;

Как указал Роберт Стам, MongoCollection.Exists и Query.Exists в данном случае не имеют значения.


* Начиная с версии 1.4 (2012-03-27) драйвер поддерживает запросы LINQ (переведенные в монго-запросы, поэтому проблем с памятью нет).

4 голосов
/ 02 октября 2016

Способ проверки существования в версии драйвера 2.x:

bool exists = collection.Find(_ => _.Name == applicationName).Any();

Или асинхронно:

bool exists = await collection.Find(_ => _.Name == applicationName).AnyAsync();;
1 голос
/ 20 июня 2011

MongoCollection.Exists проверяет, существует ли сама коллекция, а не существует ли конкретный документ.

Query.Exists (версия $ Query Builder существует) используется для запроса, содержит ли документ определенное поле (по имени).

Не существует «официального» способа выяснить, существует ли документ, соответствующий запросу, или нет, но предложение Эндрю Орсиха использовать счетчик, вероятно, является лучшим способом.Они только комментируют, что я хотел бы добавить, что если вы все равно собираетесь обрабатывать соответствующий документ (ы), то вы могли бы также продолжить и запросить их, используя некоторую вариацию Find.

0 голосов
/ 12 ноября 2018

Из этой статьи, которую мы читаем:

Однако использовать find () + limit () значительно быстрее, поскольку findOne () всегда будет читать + возвращать документесли это существует.find () просто возвращает курсор (или нет) и считывает данные, только если вы перебираете курсор.

Это означает, что использование чего-то вроде:

database.GetCollection<ApplicationViewModel>("Applications").Find(Query.EQ("Name", applicationName)).Limit(1)

, вероятно,будь быстрым.

0 голосов
/ 20 июня 2011

Я предложу методы, описанные в официальном уроке

http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-FindandFindAsmethods

Вы можете найти, а затем сосчитать, чтобы получить существование.

EDIT: Для исправления проблемы с памятью кажется, что он «существует» в методе Exists объекта MongoCollection;)

...