2013-12-25 6 views
6

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

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

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

ответ

6

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

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

UPD: Существует также возможность переписать find с использованием конвейера агрегации. Затем вы можете использовать $out operator.

1

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

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

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

1

Похоже, вы делаете свои запросы из оболочки 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) 

Если вы хотите, чтобы функция будет доступна каждый раз, когда вы начинаете Монго оболочки, вы можете включить его в свой файл .mongorc.js

+0

Ну, но я не хочу использовать '.forEach' вообще. Было бы неплохо, если бы я мог сделать db.result.save (db.docs.find (...)), но он говорит: «не может сохранить DBQuery» – vorou

+1

Я думаю, что вы пробовали, потому что внутренний db .docs.find возвращает массив, а не документ. Сохранить можно сохранить документ. См. Редактирование. – Mzzl

+0

спасибо, я уже обнаружил, что 'DBQuery' имеет метод' .toArray() ', который делает то, что я хочу. – vorou

1

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

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

{ "_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"} 

Теперь с помощью совокупного оператора я выполняю группу, а затем сохранить результат в новую коллекцию с помощью этого волшебного оператора «$ из».

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 } 

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

Смежные вопросы