如何通过稍微修改(Java 驱动程序)复制 MongoDB 中的大量条目?

How to copy lot of entries in MongoDB with slight modifications (Java driver)?

假设我有一个包含以下字段的 MongoDB 集合:

  1. buildingID(字符串)
  2. projectID(字符串)
  3. coords(longitude/latitude 坐标数组)

我有很多记录,通过 projectID 属性 分配给项目 A。现在我想

  1. 取属于项目A的所有记录,
  2. 复制它们使得
  3. 在新记录中,除projectID外的所有字段都等于原来的字段,
  4. 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 一次。这也是一个内部限制,但有助于限制内存消耗以自行管理。