当前位置: 代码迷 >> java >> 稍加修改如何在MongoDB中复制很多条目(Java驱动程序)?
  详细解决方案

稍加修改如何在MongoDB中复制很多条目(Java驱动程序)?

热度:29   发布时间:2023-07-25 20:02:57.0

想象一下,我有一个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中?

当然,还有一种更优雅的方法。 使用 ,因为这将大大减少对服务器的写入和响应次数:

    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次操作仅从服务器发送/接收一次。 这也是一个内部限制,但它有助于限制内存消耗以自行管理。

  相关解决方案