Задать вопрос
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
}
  • Вопрос задан
  • 842 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lega
В базе миллион записей. Работает в пределах 2-3 секунд. Это слишком много, хотелось бы быстрее.
Для этого запроса индексы особо и не помогут, т.к. обрабатываются все документы (без фильтрации).

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

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

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

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