问题描述
想象一下,我有一个MongoDB集合,其中包含以下字段:
-
buildingID
(字符串) -
projectID
(字符串) -
coords
(经度/纬度坐标数组)
我有很多记录,这些记录是通过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中?
1楼
当然,还有一种更优雅的方法。 使用 ,因为这将大大减少对服务器的写入和响应次数:
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次操作仅从服务器发送/接收一次。 这也是一个内部限制,但它有助于限制内存消耗以自行管理。