我使用带有节点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",
答案 0 :(得分:69)
Node.js driver documentation没有为returnNewDocument
提及findOneAndUpdate()
选项(这是MongoDB shell command具有相同名称的选项)。< / p>
相反,它提到了一个名为returnOriginal
的选项,默认为true
。尝试使用该选项,将其设置为false
以返回更新的文档,而不是原始文档。
答案 1 :(得分:8)
如果您看到的是最新的2018年版本,则returnNewDocument:true或returnOriginal:false均无效。相反,您必须在查询的选项对象中将名为new的属性设置为{..,new:true}。
答案 2 :(得分:5)
node js mongoDb driver一直是mongo shell命令的区别。如果你正在使用&#34; mongodb&#34;:&#34; ^ 2.1.4&#34;然后使用
returnOriginal:false
而不是
returnNewDocument:true
让我们看下面的代码:
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 :(得分:2)
要在执行更新操作后获取更新的文档,我们需要使用选项 "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/)
答案 4 :(得分:0)
如果在Mongoose设置中使用{ returnOriginal: false }
时遇到其他问题:
猫鼬使用{ new: true }
代替{ returnOriginal: false }
。
此处引用了此功能:Mongoose: findOneAndUpdate doesn't return updated document和Mongoose docs内:
选项:
新功能: bool -如果为true,则返回修改后的文档,而不是原始文档。默认为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 :(得分:0)
我正在使用 猫鼬:5.8.9
下面是这些行
const option = { new: true }
const account = await Account.findOneAndUpdate(filter, update, option)
这有效
答案 6 :(得分:0)
这对我有用。
req.db.collection(collectionName).findOneAndUpdate(
{ _id : commentById._id }, // matching parameters
updateOpts, //updating parameters
{returnOriginal: false} //don't use **returnNewDocument**
);
答案 7 :(得分:0)
根据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 :(得分:0)
=== 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 !
}
)