Сумма совокупного результата mongo превышает максимальный размер документа
Я использую функцию агрегации mongo для поиска дублированных документов в коллекции, где коллекции выглядят следующим образом:
{_id, placement_id, placement_name, program_id, target}
Мне нужно найти все документы, которые имеют точно такие же поля, кроме _id и placement_id,
поэтому эти два документа одинаковы:
{_id:3, placement_id:23, placement_name:"pl1", program_id:5, target:"-"}
{_id:7, placement_id:55, placement_name:"pl1", program_id:5, target:"-"}
Совокупная функция, с которой я столкнулся, это:
db.placements.aggregate({$group:{_id:{placement_name:"$placement_name", program_id:"$program_id", target:"$target"}, total:{$sum:1}}},{$match:{total:{$gte:2}}});
Затем mongo только что вернулся:
Error: Printing Stack Trace
at printStackTrace (src/mongo/shell/utils.js:37:15)
at DBCollection.aggregate (src/mongo/shell/collection.js:897:9)
at (shell):1:15
Wed Apr 2 07:43:23.090 aggregate failed: {
"errmsg" : "exception: aggregation result exceeds maximum document size (16MB)",
"code" : 16389,
"ok" : 0
} at src/mongo/shell/collection.js:898
агрегат верен, я тестировал его на меньшую коллекцию, и он отлично работает, но в сборнике имеется около 80 миллионов документов. Мне было интересно, когда вы пытаетесь найти функцию find() на 80M-документах, она работает и просит вас ввести "it" для большего количества записей. Почему совокупная функция не имеет такой возможности? Я также попытался добавить limit() в конец функции aggregate, но он не будет работать. Любая работа вокруг? Спасибо.
Ответы
Ответ 1
Каким образом агрегированная функция не имеет этой возможности?
Это произойдет в версии 2.6, которая скоро выйдет.
Я также попытался добавить limit() в конец агрегатной функции, он тоже не будет работать. любая работа вокруг?
Для структуры агрегации существует оператор $limit
: http://docs.mongodb.org/manual/reference/operator/aggregation/limit/
Ответ 2
Я столкнулся с тем же вопросом. После googling я узнал, что вы можете использовать runCommand в Mongo для использования агрегации и установить для параметра allowDiskUse значение true, чтобы использовать жесткий диск в качестве расширения памяти.
введите ссылку здесь