Как узнать, существует ли запись в коллекции Mongo (C #)

Дана коллекция элементов {url: 'http: // blah'}. Как узнать, существует ли запись с URL-адресом «http://stackoverflow.com»?

P.s. Я общаюсь с драйвером c #


person Mr Bell    schedule 08.11.2011    source источник


Ответы (4)


Чтобы любое из предыдущих предложений было эффективным, вы должны быть уверены, что на элементе url есть индекс. В противном случае потребуется полное сканирование коллекции.

Если вы ожидаете, что ответ будет только 0 или 1, подсчет, вероятно, является наиболее эффективным подходом. Если вы думаете, что количество будет очень большим и все, что вас действительно волнует, будет ли их один или несколько, FindOne - наиболее эффективный подход.

Вероятно, не имеет значения, что FindOne возвращает весь документ, если только документ на самом деле не является довольно большим. В этом случае вы можете указать серверу, чтобы он возвращал только одно поле (_id кажется наиболее вероятным кандидатом):

var query = Query.EQ("url", "http://stackoverflow.com");
var fields = Fields.Include("_id");
var res = collection.Find(query).SetFields(fields).SetLimit(1).FirstOrDefault();
if (res == null) {
    // no match found
}
person Robert Stam    schedule 09.11.2011
comment
Если вы используете var fields = Fields.Include (url) .Exclude (_id), то индекс по URL будет индексом покрытия и сможет предоставить результат, не загружая ничего из самого документа. - person Appetere; 02.05.2014

вам просто нужно проверить количество элементов, возвращаемых запросом:

int count = collection.FindAs<Item>(Query.EQ("url", "http://stackoverflow.com")).Count();
if(count > 0)
{
  //do some stuff
}
person Andrew Orsich    schedule 08.11.2011
comment
Разве это не окажется неэффективным в долгосрочной перспективе, поскольку будет произведен поиск по всей коллекции, вместо того, чтобы иметь возможность вернуться после нахождения первой? - person Mr Bell; 08.11.2011

Существование ключа в MongoDB можно проверить, используя Exists и второй параметр как true или false

var filter = builder.Exists("style", false);
var RetrievedData = collection.Find(filter).ToList()

Ссылка для ссылки

person Kesavarapu Venkatesh    schedule 03.08.2016

person    schedule
comment
Разве это не немного неэффективно, поскольку возвращает весь объект, а не только логическое значение? - person Mr Bell; 08.11.2011