2013-08-30 164 views
2

在我的网页抓取的项目,我需要搬家前一天刮数据从mongo_collectionmongo_his_collection到MongoDB的集合移动到另一个集合

我使用这个查询来移动数据

for record in collection.find(): 
    his_collection.insert(record) 

collection.remove() 

它可以更好的办法罚款,但有时它破坏时,MongoDB collection包含以上10k行

建议我一些优化的查询,将占用较少的资源并执行相同的任务

+0

谢谢你的建议,但重命名不会帮助,因为我有收集his_collection中的所有先前抓取的数据 –

+0

如何使用mongo导出和导入工具?,导出整个集合并将其导入其他集合。 –

+0

Wy你在做什么?这对于数据库服务器来说是一项繁忙的工作。 – WiredPrairie

回答

2

您可以使用MapReduce这个工作。

的MapReduce允许你指定出收集到的结果存储英寸

当哈瓦发射带有自己的_id为重点和减少函数返回第一个每个文档的地图功能(在这种情况只是因为_id是唯一的)值数组的条目,MapReduce本质上是从源收集到出收集的复制操作。

未经测试的代码:

db.runCommand(
      { 
      mapReduce: "mongo_collection", 
      map: function(document) { 
        emit(document._id, document); 
      }, 
      reduce: function(key, values) { 
        return values[0]; 
      }, 
      out: { 
        merge:"mongo_his_collection" 
      } 
      } 
     ) 
+0

唯一的问题是MR会更改文档,您需要aq清理功能将文档返回到其旧结构 – Sammaye

+0

@Sammaye如何执行aq清理功能。你能否请用MR和清理功能添加一个新的答案。我正在使用pymongo –

+0

@binit我不知道是否这会很好执行清理功能后,你会得到同样的问题,你现在做... – Sammaye

1

如果您的两个藏品都在同一个数据库中,我相信您正在寻找​​。

如果没有,你不幸有做手工,使用有针对性的mongodump/mongorestore命令:

mongodump -d your_database -c mongo_collection 
mongorestore -d your_database -c mongo_his_collection dump/your_database/mongo_collection.bson 

注意,我刚才输入从我的头顶这两个命令,而无需实际测试它们,所以确保在生产中运行它们之前检查它们。

[编辑]:对不起,我只是意识到这是你需要定期做的事情。在这种情况下,mongodump/mongorestore可能不是最佳解决方案。 我没有看到你的解决方案有什么问题 - 如果你编辑你的问题来解释你的意思是什么,它会有所帮助。

1

查询因为您不限制find()而中断。在服务器上创建游标时,mongod会尝试将整个结果集加载到内存中。这会导致问题和/或失败,如果你的收藏太大。

要避免使用跳过/限制循环。这是Java中的例子:

long count = 0 

while (true) { 
    MongoClient client = new MongoClient(); 
    DBCursor = client.getDB("your_DB_name").getCollection("mongo_collection").find().sort(new BasicDBObject("$natural", 1)).skip(count).limit(100); 

    while (cursor.hasNext()) { 
     client.getDB("your_DB_name").getCollection("mongo_his_collection").insert(cursor.next()); 
     count++; 
    } 
} 

这是可行的,但你会通过批处理写操作,以及获得更好的性能。要做到这一点,从光标构建一个DBObjects数组,并使用一个插入一次性写入它们。

另外,如果您在复印时正在修改收藏集,则无法保证您将遍历所有文档,因为如果它们的尺寸增加,最终可能会移动所有文档。

相关问题