Экспорт результата агрегации mongodb в новую коллекцию

Я хочу сохранить результат агрегации в новую коллекцию. Я знаю, что это невозможно с фреймворком на данный момент с самой командой.

Есть ли обходной путь в оболочке?


person hotips    schedule 28.11.2012    source источник


Ответы (3)


Обновление: см. ответ Сальвадора для более эффективного способа сделать это в MongoDB 2.6+.


Сохраните результат агрегирования в переменной, а затем вставьте его свойство result в новую коллекцию:

var result = db.foo.aggregate(...);
db.bar.insert(result.result);
person JohnnyHK    schedule 28.11.2012
comment
Только облом нужно держать все значения результата в памяти. См. здесь, чтобы узнать о проблеме, связанной с $out. - person Aidan Feldman; 24.06.2013
comment
Кроме того, этот набор результатов должен соответствовать стандартному размеру документа MongoDB (16 МБ). - person Aidan Feldman; 24.06.2013
comment
@AidanFeldman: встроенный результат агрегации уже ограничен максимальным документом BSON размер. - person Stennie; 24.06.2013
comment
@Stennie, к счастью, ненадолго, 2.6 решит эту проблему. - person Tom Swifty; 29.10.2013
comment
Мне удалось сделать следующее: db.foo.aggregate(...).forEach(function(it){db.bar.insert(it);}); Я не уверен, что это более эффективно, хотя. - person taari; 04.12.2017

Начиная с Mongo 2.6.0, вы можете сделать это изначально без каких-либо дополнительных манипуляций.

db.<collection>.aggregate( [
     { <operation> },
     { <operation> },
     ...,
     { $out : "<output-collection>" }
] )

Проверьте новый оператор агрегации $out для более подробного примера.

P.S. используя этот способ, вы не ограничены размером 16 МБ.

person Salvador Dali    schedule 25.10.2013
comment
Итак, что делать вам до 2.6? Мне нужно обойти ограничение в 16 МБ и при этом создать новую коллекцию с использованием конвейера агрегации в версии 2.4. - person conner.xyz; 15.08.2015
comment
Опять же, нужно обойти ограничение в 16 МБ. Работал на экземпляре 2.4. Успешно использовал find(), foreach(), insert(). - person conner.xyz; 25.09.2015
comment
Что касается ограничений, существует ли еще верхний предел данных, которые могут быть записаны в новую коллекцию, с точки зрения размера или количества документов? - person Naman; 27.03.2020

result.result больше не работает, попробуйте toArray().

var result  = db.coll.aggregate(...);
db.bar.insert(result.toArray());
person ddsh79    schedule 13.09.2016