MongoDB как проверить наличие

136
18

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


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


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

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

спросил(а) 2011-06-20T15:40:00+04:00 9 лет, 4 месяца назад
1
Решение
155

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


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

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

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


database.GetCollection<ApplicationViewModel>("Applications")
.Find(Query.Exists("Name", true));

ответил(а) 2011-06-20T16:20:00+04:00 9 лет, 4 месяца назад
80

Простейшим вариантом типа /refactor -safe является использование LINQ * с AsQueryable:


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

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


В некоторых случаях (когда производительность является проблемой) вместо подсчета всех соответствующих документов вы можете просто сказать 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 (переведенные в запросы mongo, поэтому проблем с памятью нет).

ответил(а) 2014-07-25T17:39:00+04:00 6 лет, 2 месяца назад
57

Способ проверить наличие в версии 2.x драйвера:


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

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


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

ответил(а) 2016-10-02T20:00:00+03:00 4 года назад
57

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


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


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

ответил(а) 2011-06-20T17:09:00+04:00 9 лет, 4 месяца назад
41

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


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


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


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

ответил(а) 2011-06-20T15:44:00+04:00 9 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема