gpt4 book ai didi

java - 如何复制 MongoDB 中的大量条目并稍作修改(Java 驱动程序)?

转载 作者:行者123 更新时间:2023-12-01 11:15:30 25 4
gpt4 key购买 nike

假设我有一个包含以下字段的 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 吗?

最佳答案

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

关于java - 如何复制 MongoDB 中的大量条目并稍作修改(Java 驱动程序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com