Mongodb лучший способ сделать запрос

1

Привет, начал использовать mongodb с С#, нахожу, что это действительно круто, просто интересно, как наилучшим образом запросить

Кажется, есть возможность следующих

    var query = Query<Entity>.EQ(e => e.Id, id);
    var entity = collection.FindOne(query);

против

    var entity = collection.Entity.AsQueryable().Single(x => x.Id == id)

Теперь второй выглядит более привлекательным для меня, как то, к чему я привык, но с точки зрения производительности и передовой практики, в чем разница и что рекомендуется?

  • 0
    У меня нет четкого ответа, но вы пытались окружить код System.Diagnostics.Stopwatch и выполнить запрос, скажем, тысячу раз? Должен дать вам больше информации.
  • 0
    Учитывая, что это операция с базой данных, время обращения к базе данных и обратно, вероятно, затмит любые оптимизации, которые вы выполняете в своем коде.
Показать ещё 1 комментарий
Теги:

2 ответа

1
Лучший ответ

В вашем первом примере используется собственный запрос драйверов - по существу создается QueryDocument помощью помощников Query<T> т.д.

Второй использует Linq.

Под капотом эти оба сводятся к генерации одного и того же запроса:

db.entity.find({_id: 'abc123'});

Полученный запрос QueryDocument сериализуется как запрос, в этом случае

{_id: 'abc123'}

Согласно документам linq:

Поддерживаются только запросы LINQ, которые можно перевести на эквивалентный запрос MongoDB. Если вы напишете запрос LINQ, который не может быть переведен, вы получите исключение во время выполнения, и сообщение об ошибке укажет, какая часть запроса не была поддержана.

Для меня это предложило бы некоторые накладные преобразования запросов LINQ в запросы MongoDB...

Я не тестировал это, но я подозреваю, что использование Query немного более результативно

1

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

Второй подход, являющийся прямым запросом LINQ, обычно более известен разработчикам.NET.

Шаблон спецификации предоставляет вам многоразовый фрагмент логики фильтрации. Это очень полезно, если вам часто приходится фильтровать коллекции по тем же критериям - и особенно если фильтр необходимо применять к коллекциям из разных репозиториев.

Вот краткий пример возможного его использования (прошу прощения за какой-либо грубый код, я уже не был из С#):

static class WidgetSpecification  {
    function Query<Widget> AvailableWidgets() 
    {
        return new Query<Widget>.EQ(e => 
          e.StartDate <= Date.Today 
          && e.EndDate >= Date.Today 
          && e.Active == true
          && e.InStock == true);
    }
}

Затем в любом месте вашего приложения вам понадобятся "доступные виджеты", которые вы бы назвали:

{
    ...
    var products = getProductsFromSomewhere();
    var query = WidgetSpecifiation.AvailableWidgets();

    var availableProducts = Products.Find(query);
    ...
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню