查询因为您不限制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数组,并使用一个插入一次性写入它们。
另外,如果您在复印时正在修改收藏集,则无法保证您将遍历所有文档,因为如果它们的尺寸增加,最终可能会移动所有文档。
谢谢你的建议,但重命名不会帮助,因为我有收集his_collection中的所有先前抓取的数据 –
如何使用mongo导出和导入工具?,导出整个集合并将其导入其他集合。 –
Wy你在做什么?这对于数据库服务器来说是一项繁忙的工作。 – WiredPrairie