保存MongoDB查询的结果

时间:2013-12-25 06:12:16

标签: mongodb mongo-shell

在mongo shell中进行研究时,我经常编写非常复杂的查询,并希望将结果存储在其他集合中。我知道使用.forEach()

的方法

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

但每次写这些东西都很乏味。有更干净的方式吗?我希望语法类似db.documents.find(query).dumpTo('collectionName')

4 个答案:

答案 0 :(得分:7)

以下是我将使用的解决方案:db.results.insert(db.docs.find(...).toArray())

但是仍有太多噪音。

UPD :还有一个选项可以使用聚合管道重写find。然后,您可以使用$out operator

答案 1 :(得分:2)

看起来你正在从mongo shell进行查询,它允许你用javascript编写代码。您可以将查询结果分配给变量:

result = db.mycollection.findOne(my_query)

并将结果保存到另一个集合中:

db.result.save(result)

如果要将结果附加到结果集合,可能必须删除结果的_id,以防止重复键错误

编辑:

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时该功能都可用,您可以将其包含在.mongorc.js文件中

答案 2 :(得分:1)

据我所知,MongoDB中没有内置功能。<​​/ p>

其他选项是使用mongoexport / mongoimportmongodump / mongorestore功能。

在mongoexport和mongodump中,您可以使用--query <JSON>-q <JSON>添加查询选项来过滤结果。

答案 3 :(得分:1)

如果您的查询使用聚合运算符,那么解决方案就像使用$ 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"}

现在使用聚合运算符我执行一个group by,然后使用这个神奇的运算符“$ out”将结果保存到一个新的集合中。

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

查询基本上要做的是,按名称分组&amp;状态并找到每个组的最小值和最大值,然后将结果保存到名为“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 }

我仍然需要探索$ out是多么有用,但它对任何聚合器运算符都有效。

相关问题