如何通过稍微修改(Java 驱动程序)复制 MongoDB 中的大量条目?
How to copy lot of entries in MongoDB with slight modifications (Java driver)?
假设我有一个包含以下字段的 MongoDB 集合:
buildingID
(字符串)
projectID
(字符串)
coords
(longitude/latitude 坐标数组)
我有很多记录,通过 projectID
属性 分配给项目 A。现在我想
- 取属于项目A的所有记录,
- 复制它们使得
- 在新记录中,除
projectID
外的所有字段都等于原来的字段,
projectID
等于项目B.
我可以这样做:
Collection coll = getDb().getCollection("MyColl");
final Map<String,Object> query = new HashMap<>();
query.put("projectid", "projectA");
DBCursor cursor = coll.find(new BasicDBObject(query));
while (cursor.hasNext()) {
final BasicDBObject curRecord = cursor.next();
final BasicDBObject newRecord = clone(curRecord);
newRecord.set("projectid", "projectB");
coll.insert(newRecord);
}
clone
创建 curRecord
?
的副本
有没有更优雅的方法来做到这一点?我可以避免将数据从 MongoDB 取出到 Java 并返回到 MongoDB 吗?
肯定有更优雅的方法来做到这一点。使用 Bulk Operations API,因为这将大大减少对服务器的写入和响应次数:
BulkWriteOperation bulk = coll.initializeOrderedBulkOperation();
Integer count = 0;
DBCursor cursor = coll.find(new BasicDBObject("projectid", "projectA"));
while (cursor.hasNext()) {
DBObject curRecord = cursor.next();
curRecord.removeField("_id"); // why bother with a clone when you can remove the _id
curRecord.put("projectid","projectB"); // replace the projectid
bulk.insert(curRecord);
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = collection.initializeOrderedBulkOperation();
}
}
if (count % 1000 != 0 )
bulk.execute();
现在服务器每 1000 次操作只 sent/recieved 一次。这也是一个内部限制,但有助于限制内存消耗以自行管理。
假设我有一个包含以下字段的 MongoDB 集合:
buildingID
(字符串)projectID
(字符串)coords
(longitude/latitude 坐标数组)
我有很多记录,通过 projectID
属性 分配给项目 A。现在我想
- 取属于项目A的所有记录,
- 复制它们使得
- 在新记录中,除
projectID
外的所有字段都等于原来的字段, projectID
等于项目B.
我可以这样做:
Collection coll = getDb().getCollection("MyColl");
final Map<String,Object> query = new HashMap<>();
query.put("projectid", "projectA");
DBCursor cursor = coll.find(new BasicDBObject(query));
while (cursor.hasNext()) {
final BasicDBObject curRecord = cursor.next();
final BasicDBObject newRecord = clone(curRecord);
newRecord.set("projectid", "projectB");
coll.insert(newRecord);
}
clone
创建 curRecord
?
有没有更优雅的方法来做到这一点?我可以避免将数据从 MongoDB 取出到 Java 并返回到 MongoDB 吗?
肯定有更优雅的方法来做到这一点。使用 Bulk Operations API,因为这将大大减少对服务器的写入和响应次数:
BulkWriteOperation bulk = coll.initializeOrderedBulkOperation();
Integer count = 0;
DBCursor cursor = coll.find(new BasicDBObject("projectid", "projectA"));
while (cursor.hasNext()) {
DBObject curRecord = cursor.next();
curRecord.removeField("_id"); // why bother with a clone when you can remove the _id
curRecord.put("projectid","projectB"); // replace the projectid
bulk.insert(curRecord);
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = collection.initializeOrderedBulkOperation();
}
}
if (count % 1000 != 0 )
bulk.execute();
现在服务器每 1000 次操作只 sent/recieved 一次。这也是一个内部限制,但有助于限制内存消耗以自行管理。