gpt4 book ai didi

javascript - Mongoose 确定更新更新插入或更新

转载 作者:可可西里 更新时间:2023-11-01 09:24:34 27 4
gpt4 key购买 nike

我想测试更新的“upsert”选项是否正常。所以我用相同的键将一个对象“upsert”到 mongodb 两次。但是它没有显示插入的消息。我错过了什么吗?

(mongodb:v2.6.3; Mongoose :3.8.15)

Member.findOneAndRemove({user_id: 1},
function (err, doc) {
if (!err) onsole.log(doc ? 'deleted' : 'not found');
}); // -> deleted, make sure user_id = 1 doesn't exist

Member.update({user_id: 1},
{$set: {name: "name1"}},
{upsert: true, new: false}, // new : false, so that I can detect original doc is null then know it's a new one.
function (err, doc) {
if (!err) {
console.log(doc ? 'updated' : 'inserted')
}
}); // -> updated ? But it shoule be inserted, right ?

Member.update({user_id: 1},
{$set: {name: "name2"}},
{upsert: true, new: false},
function (err, doc) {
if (!err) {
console.log(doc ? 'updated' : 'inserted')
}
}); // -> updated, yes, no problem.

感谢您的任何提示。

============回答=============

使用.findOneAndUpdate而不是 .update !此外,确保选项是 {upsert: true, new: false},这样回调的第二个参数(doc)可以是原始文档以防万一。

最佳答案

mongoose 中的 .update() 方法接受三个回调参数,即 errnumAffectedraw 响应。使用“原始”对象查看发生了什么:

Member.update({user_id : 1}, 
{$set : {name:"name1"}},
{upsert : true },
function (err, numAffected, raw) {
if (!err) {
console.log(raw)
}
});

你会看到这样的结构:

{ ok: true,
n: 1,
updatedExisting: false,
upserted: [ { index: 0, _id: 5456fc7738209001a6b5e1be } ] }

因此总是有 n 和 'updatedExisting 键可用,其中第二个在更新插入时为 false,否则为 true。upserted 将包含 _id` 创建的任何新文档的值。

至于 n 或“numAffected”,在遗留写入关注响应下匹配文档的情况下,这基本上总是 1。

您可以使用批量操作表单在 MongoDB 2.6 及更高版本中看到新的 WriteResult 响应:

var bulk = Member.collection.initializeOrderedBulkOp();
bulk.find({user_id : 1}.upsert().update({$set : {name:"name1"}});
bulk.execute(err,result) {
console.log( JSON.stringify( result, undefined, 2 ) );
}

在第一次迭代中你会得到这样的东西:

{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 1,
"nMatched": 0,
"nModified": 0,
"nRemoved": 0,
"upserted": [
{
"index": 0,
"_id": "5456fff138209001a6b5e1c0"
}
]
}

第二个具有相同的参数,如下所示:

{
"ok": 1,
"writeErrors": [],
"writeConcernErrors": [],
"nInserted": 0,
"nUpserted": 0,
"nMatched": 1,
"nModified": 0,
"nRemoved": 0,
"upserted": []
}

并且文档只会在实际发生更改的地方标记为“已修改”。

因此无论如何,.update() 操作不会返回修改后的文档或原始文档。那就是 .findOneAndUpdate() 方法,它是围绕执行原子操作的基本 .findAndModify() 的 Mongoose 包装器。 .update() 方法通常用于批量操作,因此不会返回文档内容。

关于javascript - Mongoose 确定更新更新插入或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26708036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com