使用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
相关产品推荐
相关产品推荐

