【问题标题】:How to copy lot of entries in MongoDB with slight modifications (Java driver)?如何在 MongoDB 中复制大量条目并稍作修改(Java 驱动程序)?
【发布时间】:2015-08-07 13:56:40
【问题描述】:

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

  1. buildingID(字符串)
  2. projectID(字符串)
  3. coords(经度/纬度坐标数组)

我有很多记录,通过 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 中吗?

【问题讨论】:

标签: java mongodb mongodb-java


【解决方案1】:

肯定有更优雅的方式来做到这一点。使用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 次操作才从服务器发送/接收信息。这也是一个内部限制,但它有助于限制内存消耗以自行管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多