Подтвердить что ты не робот

Разница между агрегатом ($ match) и find, в MongoDB?

В чем разница между оператором $match, используемым внутри агрегатной функции, и регулярным find в Mongodb?

Почему функция find не позволяет переименовывать имена полей, такие как функция агрегата? например В совокупности мы можем передать следующую строку:

{ "$project" : { "OrderNumber" : "$PurchaseOrder.OrderNumber" , "ShipDate" : "$PurchaseOrder.ShipDate"}}

В то время как поиск не позволяет этого.

Почему итоговый результат не возвращается как DBCursor или List? и почему мы не можем получить количество возвращаемых документов?

Спасибо.

4b9b3361

Ответ 1

Почему итоговый результат не возвращается как DBCursor или List?

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

Эта структура обычно используется для вычисления данных, требующих полного ввода-вывода в качестве входных данных и нескольких документов в качестве вывода.

В чем разница между оператором $match, используемым внутри агрегированной функции, и регулярной находкой в ​​Mongodb?

Одно из отличий, как вы заявили, - это тип возврата. Вывод выходных данных операции в качестве DBCursor.

Другие отличия:

  • Результат агрегирования должен быть до 16 МБ. Если вы используете shards, то полные данные должны быть собраны в одной точке после первого $group или $sort.
  • $совпадение только для повышения эффективности агрегации, но у него есть некоторые другие виды использования, такие как улучшение производительности агрегации.

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

Вы можете. Просто подсчитайте количество элементов в результирующем массиве или добавьте следующую команду в конец канала:

{$group: {_id: null, count: {$sum: 1}}}

Почему функция find не позволяет переименовывать имена полей, такие как агрегатная функция?

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

EDIT (2014/02/26):

Операции агрегации MongoDB 2.6 вернут курсор.

EDIT (2014/04/09):

MongoDB 2.6 был выпущен с прогнозируемыми изменениями агрегации.

Ответ 2

Я исследовал несколько вещей об агрегировании и поиске вызова: Я сделал это с нисходящей сортировкой в ​​таблице из 160 тыс. Документов и ограничил свой вывод несколькими документами.

  • Команда агрегирования работает медленнее, чем команда find.
  • Если вы получаете доступ к данным типа ToList(), то агрегирование выполняется быстрее, чем поиск.
  • если вы наблюдаете за общее время (точка 1 + 2), команды кажутся равными

Возможно, агрегация автоматически вызывает ToList() и не требует повторного вызова. Если вы не вызываете ToList(), вызов find() будет намного быстрее.

7 [мс] против 50 [мс] (5 документов)