如何从 findOneAndUpdate 方法中获取更新的文档?
Posted
技术标签:
【中文标题】如何从 findOneAndUpdate 方法中获取更新的文档?【英文标题】:How to get updated document back from the findOneAndUpdate method? 【发布时间】:2016-06-08 03:40:12 【问题描述】:我正在使用带有节点 js 的 MongoDB,我使用了 npm install mongodb
我想更新现有文档并返回更新后的文档,文档已正确更新。但它返回旧文档意味着更新前的原始文档。我使用了returnNewDocument:true
参数但没有用。
var filter =
'_id': object_id
,
update =
$set: "status" : data["status"] ,
$push:
"statusHistory":
$each: [ status:data["status"],statusChangedTime:data["statusChangedTime"],comment:data["comment"]],
$position:0,
,
,options =
//upsert: false,
//multi: false,
returnNewDocument: true
;
col.findOneAndUpdate(filter, update, options,function(err, res)
if (err)
console.log(err);
else
console.log(res);
);
回应是
lastErrorObject: updatedExisting: true, n: 1 ,
value:
//original document
,
ok: 1
当我通过终端直接进入mongoDB并尝试时
db.MyCollection.find().pretty();
文档已正确更新,它只返回原始文档而不是更新文档。
在这里停留了 2 小时,感谢任何帮助
在 package.json 中
"mongodb": "^2.1.4",
【问题讨论】:
使用的是什么版本的mongodb? 3.2? 【参考方案1】:Node.js driver documentation 没有提到findOneAndUpdate()
的returnNewDocument
选项(这是同名MongoDB shell command 的选项)。
相反,它提到了一个名为returnOriginal
的选项,默认为true
。尝试使用该选项,将其设置为 false
以返回更新的文档而不是原始文档。
【讨论】:
你是对的。不幸的是,命名不一致也影响了 mongodb。希望他们能修复它。 太好了,解决了这个问题。非常感谢:) :) 在这个问题上浪费了 1 小时。非常感谢。 @Sulliwane 你一定会得到一个不同的页面,因为它清楚地提到了returnOriginal
(image)。
我必须使用new: true
才能返回新文档。 returnOriginal: false
和 returnNewDocument: true
对我不起作用。使用 Node v10.12.0 和 mongoose 5.3.14。【参考方案2】:
与命令 findOneAndUpdate()
的原生 MongoDB shell 相比,NodeJS MongoDB driver 具有不同的参数。如果您使用的是“mongodb”:“^2.1.4”,请使用
returnOriginal: false
改为
returnNewDocument: 真
.
让我们看看下面的代码:
db.collection('user_setting').findOneAndUpdate(user_id: data.user_id, $set: data, projection: dbConfig.userSetting, returnOriginal: false, function (err, res)
if (err)
callback('error': 1, 'message': 'Internal server error! ' + err, 'data': null, 'status': 500);
else
console.log(res);
/* lastErrorObject: updatedExisting: true, n: 1 ,
value:
user_id: 1,
notification_alert: 1,
notification_sound: 1,
user_setting_id: 2
,
ok: 1
*/
);
【讨论】:
【参考方案3】:如果您看到的是 2018 年最新版本,则 returnNewDocument:true 和 returnOriginal: false 都不起作用。您必须改为在查询的选项对象中将名为 new 的属性设置为 true,如 .., new: true。
【讨论】:
这仅适用于findAndModify
,已弃用:mongodb.github.io/node-mongodb-native/2.1/api/…。而是使用 findOneAndUpdate
mongodb.github.io/node-mongodb-native/2.1/api/… 和 returnOriginal
。命名不一致是疯狂的。【参考方案4】:
如果其他人在 Mongoose 设置中使用 returnOriginal: false
时遇到此问题:
Mongoose 使用 new: true
而不是 returnOriginal: false
。
此处引用了该功能:Mongoose: findOneAndUpdate doesn't return updated document 和 Mongoose docs 内:
选项:
new: bool - 如果为真,则返回修改后的文档而不是原始文档。默认为 false(在 4.0 中更改)
所以当使用findOneAndUpdate
时,将new: true
添加到方法选项中:
...
const options =
new: true
;
col.findOneAndUpdate(filter, update, options, function (err, res)
if (err)
console.log(err);
else
console.log(res);
);
【讨论】:
【参考方案5】:我正在使用 猫鼬:5.8.9
下面这些行
const option = new: true
const account = await Account.findOneAndUpdate(filter, update, option)
这是有效的
【讨论】:
【参考方案6】:这对我有用。
req.db.collection(collectionName).findOneAndUpdate(
_id : commentById._id , // matching parameters
updateOpts, //updating parameters
returnOriginal: false //don't use **returnNewDocument**
);
【讨论】:
【参考方案7】:根据 4.0+ 的实际源代码和类型定义,new 属性现在是 new
。设置true
返回修改后的结果。
interface QueryFindOneAndUpdateOptions extends QueryFindOneAndRemoveOptions
/** if true, return the modified document rather than the original. defaults to false (changed in 4.0) */
new?: boolean;
...
【讨论】:
【参考方案8】:要在执行更新操作后获取更新的文档,我们需要使用选项"returnDocument" : "after"
和"returnOriginal" : false
。
根据最新的 mongodb 节点驱动程序 v3.6 文档,不推荐使用 returnOriginal。但是当我尝试只包含"returnDocument" : 'after'
而没有"returnOriginal":false
时,它会返回原始记录而不是更新的记录。
使用它们都可以提供更新记录的所需输出,而不是原始记录。
(来源:http://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#findOneAndUpdate)
选项
"returnNewDocument" : true
是一个 mongo shell 选项,根据官方 mongodb 文档(此处提到 https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/),可能无法在节点驱动程序中工作
【讨论】:
像魅力一样工作(2021 年)!这个答案需要得到更多的支持 完美。省时间。 :-) 感谢您的回答。它节省了我的时间【参考方案9】:=== 2021 年 8 月
随着 node.js 客户端 v4 的发布,returnOriginal: false
的旧解决方案似乎不再是正确的答案。
要查看 node.js findOneAndUpdate 方法的可用选项列表:https://mongodb.github.io/node-mongodb-native/4.0/interfaces/findoneandupdateoptions.html
但简而言之,这应该可行:
const doc = await <Collection>.findOneAndUpdate(
... search ,
$set:
field1: 'value 1',
field2: ['value 2'],
etc.
,
,
upsert: true,
returnDocument: 'after', // this is new !
)
【讨论】:
如果您在 2021 年 8 月更新了mongodb
驱动程序,这是正确的。让我头痛了 60 分钟。谢谢@Zach!以上是关于如何从 findOneAndUpdate 方法中获取更新的文档?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongodb 的 findOneAndUpdate 中使用对象作为过滤器
(mongoose/promises) 如何检查文档是不是是使用 findOneAndUpdate 和 upsert 创建的
Mongoose findOneAndUpdate 更新多个字段
使用 findOneAndUpdate() 时,如果没有提供值,如何保持字段不变(而不是用 null 覆盖)?