【问题标题】:Is there a better way to export a mongodb query to a new collection?有没有更好的方法将 mongodb 查询导出到新集合?
【发布时间】:2011-09-17 22:51:09
【问题描述】:

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

db.masterproducts.find({category:"scuba gear"}).copyTo(db.newcollection)

当然,我知道“copyTo”不存在。

我认为我可以使用 MapReduce 来做到这一点,因为结果是使用 v1.8 中的新“out”参数在新集合中创建的;但是,这个新系列不是我原始系列的子集。或者如果我正确使用 MapReduce 可以吗?

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

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

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

非常感谢任何帮助。

谢谢

鲍勃

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    您可以遍历查询结果并像这样保存每个项目:

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

    【讨论】:

      【解决方案2】:
      1. 您可以创建小型服务器端javascript(如this one,只需添加您想要的过滤器)并使用eval执行它
      2. 您可以按照上述方式使用转储/恢复
      3. 复制收集命令应该很快在 mongodb 中(将按投票顺序完成)!见jira feature.

      【讨论】:

      • 选项 1 很完美,非常感谢。期待在某个时候看到选项 3 :)
      • 我可以在 mongodump 的 '-q' 中编写比 find() 查询更复杂的内容吗?我想将聚合查询的结果集定向到临时集合。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        还有 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())
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多