1、单条更新? ? ? ??
MongoDB 集合 test1,有字段 _id,createTime,createTimeStr,name字段 , 查询createTime不为空的,根据 _id 生成该条记录的创建时间时间戳并填写到字段 createTime 字段中 ,并打印时间戳
// 查询 createTime 为空的记录
var cursor = db.getCollection("test1").find({"createTime" : null});
while (cursor.hasNext()) {
var doc = cursor.next();
try {
// 提取时间戳部分
var timestamp = doc._id.getTimestamp();
var timestamp2 = Date.parse(timestamp);
// 格式化时间字符串为“yyyyMMdd”
var formattedDate = timestamp.toISOString().slice(0, 10).replace(/-/g, '');
print("Document _id: " + doc._id +" , timestamp2 " + timestamp2 + " , Create Time: " + formattedDate);
db.test1.update(
{ _id: doc._id },
{ $set: { createTime: timestamp2, createTimeStr: formattedDate } }
);
} catch (e) {
// 打印异常信息
print("Error processing document _id: " + doc._id + ". Error: " + e);
// 继续执行下一个文档
continue;
}
}
2、批量更新
var bulkUpdateOps = [];
var batchSize = 1000; // 每批次更新的文档数量
var cursor = db.getCollection("test1").find({ "createTime": null });
cursor.forEach(function (doc) {
try {
var timestamp = doc._id.getTimestamp();
var timestamp2 = Date.parse(timestamp);
var formattedDate = timestamp.toISOString().slice(0, 10).replace(/-/g, '');
bulkUpdateOps.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$set": {
"createTime": timestamp2,
"createTimeStr": formattedDate
}
}
}
});
// 批量更新达到 batchSize 时执行一次
if (bulkUpdateOps.length === batchSize) {
db.getCollection("test1").bulkWrite(bulkUpdateOps);
bulkUpdateOps = []; // 重置批量更新数组
}
} catch (e) {
print("Error processing document _id: " + doc._id + ". Error: " + e);
// 继续执行下一个文档
}
});
// 处理剩余的批量更新
if (bulkUpdateOps.length > 0) {
db.getCollection("test1").bulkWrite(bulkUpdateOps);
}
代码解释
使用 MongoDB 的
bulkWrite
方法对满足特定条件的文档进行批量更新,而不是逐个文档进行更新。以下是代码的主要步骤:
初始化变量:
bulkUpdateOps
: 用于存储批量更新操作的数组。batchSize
: 每批次更新的文档数量。查询文档:
- 使用?
find
?方法检索具有特定条件("createTime": null
)的文档。遍历文档:
- 使用?
forEach
?方法遍历查询结果的每个文档。文档处理:
- 提取文档的时间戳部分,并将其转换为 Unix 时间戳 (
timestamp2
) 和格式化日期字符串 (formattedDate
)。- 将更新操作添加到?
bulkUpdateOps
?数组中。批量更新检测:
- 检查?
bulkUpdateOps
?数组的长度是否达到设定的?batchSize
。- 如果是,使用?
bulkWrite
?方法执行批量更新,然后重置?bulkUpdateOps
?数组。异常处理:
- 在处理文档时,使用?
try-catch
?块捕获任何可能的异常,例如无法解析时间戳。- 如果发生异常,打印错误信息,但不中断整体流程,继续处理下一个文档。
处理剩余批量更新:
- 在遍历完成后,检查?
bulkUpdateOps
?数组是否包含剩余的更新操作。- 如果有,使用?
bulkWrite
?方法执行这些剩余的批量更新。通过批量操作来提高 MongoDB 数据库中文档的更新效率。在大数据集的情况下,批量更新通常比逐个更新更为高效。