You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用MongoDB findAndModify(upsert)实现created_at仅插入时创建不更新

如何让MongoDB findAndModify的upsert操作仅在插入新文档时设置created_at字段

你的问题核心是要区分插入新文档和更新已有文档时的字段处理逻辑——created_at只在首次插入时生成,后续更新不能改动它。你当前的代码用$set直接覆盖整个account对象,不管是更新还是插入都会重新设置created_at,这显然不符合需求。

解决这个问题的关键是使用MongoDB的$setOnInsert操作符,它只会在upsert触发插入动作的时候生效,更新已有文档时会被忽略。我们可以把created_at的设置放在$setOnInsert里,其他需要更新的字段放在$set中,这样就能完美实现你的需求。

修改后的代码如下:

var acctsCollection = "accounts";
// 拆分更新逻辑:业务字段用$set,创建时间用$setOnInsert
var newUpdate = {
  $set: { newData: newData },
  $setOnInsert: { created_at: new Date() }
};
var options = { upsert: true, new: true };
collectionDriver.findAndModify(acctsCollection, query, newUpdate, options);

代码解释:

  • $set: { newData: newData }:无论更新还是插入都会执行,负责更新你需要变动的业务字段(比如这里的newData)。
  • $setOnInsert: { created_at: new Date() }:仅在MongoDB找不到匹配query的文档、触发upsert插入时,才会设置created_at字段;如果找到已有文档进行更新,这个操作符会被完全忽略,不会改动原有的created_at值。
  • 保留options里的upsert: true和new: true,确保找不到文档时自动插入,并且返回操作后的最新文档。

这样调整后,就能严格满足你提出的三个需求:文档始终包含created_at、插入时创建该字段、更新时不修改它。

内容的提问来源于stack exchange,提问作者GJain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:09