Сумма совокупного результата 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, чтобы использовать жесткий диск в качестве расширения памяти. введите ссылку здесь