Сохранение результата запроса MongoDB

при выполнении исследования в Mongo shell я часто пишу довольно сложные запросы и хочу, чтобы результат хранился в другой коллекции. Я знаю, как это сделать с .forEach():

db.documents.find(query).forEach(function(d){db.results.insert(d)})

но это как-то утомительно писать этот материал каждый раз. Есть ли более рациональный способ? Я бы хотел, чтобы синтаксис был чем-то вроде db.documents.find(query).dumpTo('collectionName').

4 ответов


вот решение, которое я буду использовать: db.results.insert(db.docs.find(...).toArray())

по-прежнему слишком много шума.

UPD: существует также возможность переписать find использование трубопровода агрегации. Тогда вы можете использовать $out оператор.


насколько я знаю, в MongoDB нет встроенной функциональности для этого.

другие варианты будут использовать mongoexport/mongoimport или mongodump/mongorestore функции.

в mongoexport и mongodump вы можете фильтровать результаты, добавляя параметры запроса с помощью --query <JSON> или -q <JSON>.


похоже, вы выполняете свои запросы из оболочки mongo, которая позволяет писать код на javascript. Результат запросов можно назначить переменной:

result = db.mycollection.findOne(my_query)

и сохраните результат в другой коллекции:

db.result.save(result)

возможно, вам придется удалить _id результата, если вы хотите добавить его в коллекцию результатов, чтобы предотвратить дубликат ошибки ключа

Edit:

db.mycollection.findOne({'_id':db.mycollection.findOne()['_id']})
db.foo.save(db.bar.findOne(...))

если вы хотите сохранить массив, вы можете написать функция JavaScript. Должно работать что-то вроде следующего (я не тестировал его):

function save_array(arr) {
    for(var i = 0; i < arr.length; i++) {
        db.result.save(arr[i])
    }
}

...

result = db.mycollection.find(...)
save_array(result)

если вы хотите, чтобы функция была доступна каждый раз при запуске Mongo shell, вы можете включить ее в свой


если ваш запрос использует оператор агрегации, то решение является таким же образцом, как и использование $out.

Я создал образец коллекции с именем "tester", который содержит следующие записи.

{ "_id" : ObjectId("4fb36bfd3d1c88bfa15103b1"), "name" : "bob", "value" : 5, "state" : "b"}

{ "_id" : ObjectId("4fb36c033d1c88bfa15103b2"), "name" : "bob", "value" : 3, "state" : "a"} 

{ "_id" : ObjectId("4fb36c063d1c88bfa15103b3"), "name" : "bob", "value" : 7, "state" : "a"}   

{ "_id" : ObjectId("4fb36c0c3d1c88bfa1a03b4"), "name" : "john", "value" : 2, "state" : "a"}

{ "_id" : ObjectId("4fb36c103d1c88bfa5103b5"), "name" : "john", "value" : 4, "state" : "b"} 

{ "_id" : ObjectId("4fb36c143d1c88bfa15103b"), "name" : "john", "value" : 8, "state" : "b"}

{ "_id" : ObjectId("4fb36c163d1c88bfa15103a"), "name" : "john", "value" : 6, "state" : "a"}

теперь, используя оператор aggregate, я выполняю группу, а затем сохраняю результат в новую коллекцию, используя этот магический оператор "$out".

db.tester.aggregate([{$group:{
                                _id:{name:"$name",state:"$state"},
                                min:{$min:"$value"},
                                max:{$max:"$value"},
                               } },
                       {$out:"tester_max_min"}
                     ])

что в основном запрос пытается сделать, это группа по имени и состоянию и найти мин и Макс значения для каждой отдельной группы, а затем сохранить результат в новую коллекцию с именем "tester_max_min"

db.tester_max_min.find();

сформированная новая коллекция будет содержать следующие документы:

{ "_id" : { "name" : "john", "state" : "b" }, "min" : 4, "max" : 8 }

{ "_id" : { "name" : "john", "state" : "a" }, "min" : 2, "max" : 6 }

{ "_id" : { "name" : "bob", "state" : "a" }, "min" : 3, "max" : 7 }

{ "_id" : { "name" : "bob", "state" : "b" }, "min" : 5, "max" : 5 }

мне все еще нужно изучить, насколько полезен can $out, но он работает как шарм для любого оператора агрегатора.