本文主要是介绍MongoDB 根据 _id 获取记录的创建时间并回填记录中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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 数据库中文档的更新效率。在大数据集的情况下,批量更新通常比逐个更新更为高效。
这篇关于MongoDB 根据 _id 获取记录的创建时间并回填记录中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!