Задать вопрос
un1t
@un1t

Как ускорить агрегацию в MongoDB 3.2?

Есть запрос вида:
db.foo.aggregate([{$group: {_id: 1, 'myavg': {$avg:'$value'}}}])


В базе миллион записей. Работает в пределах 2-3 секунд. Это слишком много, хотелось бы быстрее.
Если я правильно понял монга 3.2, может использовать при агрегации обычные индексы.

Changed in version 3.2: Starting in MongoDB 3.2, indexes can cover an aggregation pipeline. In MongoDB 2.6 and 3.0, indexes could not cover an aggregation pipeline since even when the pipeline uses an index, aggregation still requires access to the actual documents.

https://docs.mongodb.org/manual/core/aggregation-p...

Но построение индекса
db.foo.ensureIndex({value:1})
кажется на ситуацию не влияет

explain выглядит так:
{
	"waitedMS" : NumberLong(0),
	"stages" : [
		{
			"$cursor" : {
				"query" : {
					
				},
				"fields" : {
					"correct" : 1,
					"_id" : 0
				},
				"queryPlanner" : {
					"plannerVersion" : 1,
					"namespace" : "mydb.foo",
					"indexFilterSet" : false,
					"parsedQuery" : {
						"$and" : [ ]
					},
					"winningPlan" : {
						"stage" : "COLLSCAN",
						"filter" : {
							"$and" : [ ]
						},
						"direction" : "forward"
					},
					"rejectedPlans" : [ ]
				}
			}
		},
		{
			"$group" : {
				"_id" : {
					"$const" : 1
				},
				"myavg" : {
					"$avg" : "$correct"
				}
			}
		}
	],
	"ok" : 1
}
  • Вопрос задан
  • 848 просмотров
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    Фулстек-разработчик
    16 месяцев
    Далее
  • Яндекс Практикум
    Бэкенд на Node.js для фронтенд-разработчиков
    3 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
@lega
В базе миллион записей. Работает в пределах 2-3 секунд. Это слишком много, хотелось бы быстрее.
Для этого запроса индексы особо и не помогут, т.к. обрабатываются все документы (без фильтрации).

2-3сек может и норм - зависит от вашего железа, когда вам потребуется действительно быстро, то вы сможете сделать один документ: { total: ..., count: ...} и будете за 1мс получать результат.

Так же ещё можете попробовать "_id : null" вместо "_id: 1"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы