有没有更好的方法将mongodb查询导出到新集合?

时间:2011-06-18 21:54:08

标签: mongodb mapreduce

我想要的: 我有一个主要的产品集合,然后我想过滤它们并将它们放在一个单独的集合中。

  

db.masterproducts.find({category:“scuba gear”})。copyTo(db.newcollection)

当然,我意识到'copyTo'不存在。

我认为我可以使用MapReduce来完成它,因为使用v1.8中新的'out'参数在新集合中创建结果;但是这个新系列不是我原始系列的一个子集。或者是否可以正确使用MapReduce?

为了解决这个问题,我目前正在这样做: 步骤1: / usr / local / mongodb / bin / mongodump --db database --collection masterproducts -q'{category:“scuba gear”}'

第2步: / usr / local / mongodb / bin / mongorestore -d database -c newcollection --drop packages.bson

我的两步法似乎效率很低!

非常感谢任何帮助。

由于

鲍勃

4 个答案:

答案 0 :(得分:12)

您可以遍历查询结果并保存每个项目,如下所示:

db.oldCollection.find(query).forEach(function(x){db.newCollection.save(x);})

答案 1 :(得分:4)

  1. 您可以创建小型服务器端javascript(如this one,只需添加所需的过滤)并使用eval
  2. 执行它
  3. 您可以按照上述方式使用转储/恢复
  4. 复制收集命令很快就会在mongodb中(将以投票顺序完成)!请参阅jira feature.

答案 2 :(得分:0)

您应该能够使用mapreduce创建子集(使用“out”)。问题是mapreduce有一个特殊的输出格式,所以你的文档将被转换(有一个JIRA票证,以添加对另一种格式的支持,但我目前无法找到它)。它也将是非常无效的:/

将光标复制到集合很有意义,我建议为此创建一张票。

答案 3 :(得分:0)

还有toArray()方法可以使用:

//create new collection 
db.creatCollection("resultCollection")

// now query for type="foo" and insert the results into new collection
db.resultCollection.insert( (db.orginialCollection.find({type:'foo'}).toArray())