Я столкнулся со странной проблемой, когда запрашивал одну из наших коллекций и собирал результат в другую коллекцию . Я запрашиваю уникальных пользователей, которые выполнили какое-то действие, и спроецировал количество действий, выполненных для каждого пользователя в запросе агрегации.
var result = db.getCollection('user_actions').aggregate(
[
{"$match":{"createdAt":{"$gte":1585161000000,"$lt":1585247340000}}},
{"$group":{"_id":{"accountId":"$user.id"},"count":{"$sum":1}}},
{"$sort": {"count": -1}},
{"$project":{"_id":0,"count":"$count","accountId":"$_id.accountId"}}
]
)
db.getCollection('winners').insert(result.toArray())
db.getCollection('winners').find({}).count()
В результате вышеупомянутого запроса вставляется 12643 документов в вновь созданная коллекция.
Я также попытался выполнить запрос с allowDiskUse и значением начального размера пакета курсора . Но статистика коллекции как выходного сигнала конвейера агрегации осталась прежней, и я тоже не получаю никаких исключений .
{
"ns" : "data.winners",
"size" : 1121979,
"count" : 12639,
"avgObjSize" : 88,
"storageSize" : 4096,
"capped" : false,
"wiredTiger" : {...},
"nindexes" : 1,
"totalIndexSize" : 4096,
"indexSizes" : {
"_id_" : 4096
},
"ok" : 1,
"operationTime" : Timestamp(1585321431, 41),
"$gleStats" : {...},
"lastCommittedOpTime" : Timestamp(1585321431, 41),
"$configServerState" : {...},
"$clusterTime" : {... }
}
Это было скорее настройкой сюжета, теперь, когда я удаляю запрос sort
из агрегации, он в результате выдает 26397 документов. Я мог бы выбрать некоторые отдельные учетные записи из этого результата и убедиться, что это правильный результат, который я должен был получить в первую очередь ( отсортировано дополнительно). Я попытался просмотреть MongoDB Limits and Thresholds , но не смог найти связь с наблюдением.
Версия базы данных
db.version()
4.0.0
Подробности оболочки
mongo -version
MongoDB shell version v4.2.1
git version: edf6d45851c0b9ee15548f0f847df141764a317e
allocator: system
modules: none
build environment:
distarch: x86_64
target_arch: x86_64
Редактировать : Стоит упомянуть, как обсуждалось с Валижоном в комментариях, используя другой этап в конвейере агрегации для подсчета обработанных документов:
{"$count": "winners"}
приводит к одному и тому же значению 26397 с этапом {"$sort": {"count": -1}}
и без него.
Для меня это не похоже на предел памяти сортировки , поскольку выкинул ошибку согласно документации.