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

使用MongoDB findAndModify:如何获取新文档并判断操作是插入还是更新?

判断findAndModify的upsert操作是插入还是更新

好问题!其实你不用额外做复杂查询——MongoDB的findAndModify在执行upsert操作时,返回的结果对象里已经包含了判断操作类型的关键信息,完全可以直接通过它来区分是插入还是更新。

核心判断逻辑

你的回调函数里拿到的result对象(建议把原代码里的resultDoc参数名调整得更清晰),包含一个lastErrorObject字段,通过它的属性就能精准判断:

  • 插入操作:lastErrorObject.upserted会存在(值就是新插入文档的_id),同时lastErrorObject.n为0(因为没有匹配到原有文档进行更新)。
  • 更新操作:lastErrorObject.upserted不存在,lastErrorObject.n为1(表示匹配并更新了1条已有文档)。

修改后的代码示例

var newUpdate = { $set : newData, $setOnInsert: {created_at: new Date()} };
var options = { upsert : true, new: true };
collectionDriver.findAndModify(colName, query, newUpdate, options, function(err, result) {
  if (err) {
    console.error('操作出错:', err);
    return;
  }
  
  // 获取你需要的新文档
  const newDoc = result.value;
  // 判断操作类型
  const isInsert = !!result.lastErrorObject.upserted;
  const operationType = isInsert ? 'insert' : 'update';
  
  console.log(`本次操作类型:${operationType}`);
  console.log('返回的新文档:', newDoc);
});

备选小技巧(不推荐作为首选)

因为你用了$setOnInsert给新插入的文档添加了created_at字段,如果你能确保原有文档绝对不会有这个字段,也可以通过检查新文档是否包含created_at来判断:

const isInsert = !!newDoc.created_at;

但这个方法有局限性——如果原有文档碰巧也有created_at,就会判断错误,所以还是优先用lastErrorObject的方法更可靠。

内容的提问来源于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:21:51