gpt4 book ai didi

javascript - 为什么用 $addToSet 更新总是返回 1

转载 作者:可可西里 更新时间:2023-11-01 09:31:18 25 4
gpt4 key购买 nike

我正在使用 mongoose,当我按以下方式进行更新时

model.update({_id: id}, {$addToSet: {refs: refId}}, function(err, numAffected){
console.log(numAffected);
})

这是有效的,如果元素已经在数组中但 numAffected 始终为 1,我的引用不会更新。

这是正确的行为吗?因为它对我没有意义。如果元素未被修改,则 numAffected 应为 0。

有没有办法按照我的意愿完成或使用这个库?

提前致谢。

最佳答案

这是因为 mongoose 尚未更新以执行与 MongoDB 2.6 版本相同的 mongo shell 正在执行的操作。

MongoDB 2.6 版本引入了批量操作 API,它实际上扩展了写关注响应的统计信息。 “更新”、“插入”和“删除”等 shell 命令已更新为在其实现中实际使用此 API。事实上,您可以在 shell 中通过调用一个没有结尾括号的方法来看到这一点:

db.collection.update

这显示了包装实现的 API 方法的代码,以及“回退”到 mongoose 当前使用的“遗留”写关注响应模式。

如果您的 mongoose 版本足够新,则捆绑的 Node native 驱动程序将支持这些操作。但是您必须通过从模型或其他方式访问 .collection 方法来引用原始集合对象。您还必须确保数据库连接实际上是事件的。例如,我通过将代码放在连接的“打开”事件中来强制执行此操作:

var mongoose = require('mongoose'),
async = require('async'),
Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost');

var testSchema = new Schema({
user: String,
list: []
});

var Test = mongoose.model( "Test", testSchema, "mytest" );

mongoose.connection.on("open",function(err,conn) {

var batch = Test.collection.initializeOrderedBulkOp();

batch.find({ "user": "me"}).upsert().updateOne({ "$addToSet": { "list": 7 }});

batch.execute(function(err,result) {
console.log( JSON.stringify( result, undefined, 4 ) );
});

});

第一个更新操作的响应,并假设已经存在一个匹配的文档,显示来自操作的扩展统计信息,在“mMatched”和“nModified”中都有一个单独的计数器:

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

如果那是一个“upsert”,计数器将在“nUpserted”上,并且统计信息中的“upserted”数组包含已创建文档的 _id

在第二次迭代中,响应将指示文档实际上“匹配”但未执行更新:

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

这是此 API 为您提供的新统计信息。 “mongoose”方法当前使用的“遗留”实现没有进行这种区分。因此,不返回是否实际发生了任何“更新/修改”。

因此,如果您有足够新的版本来支持此操作,您可以实现您的代码以完全按照上面所示的方式执行操作。我希望当前的维护者会意识到实现的变化,并将努力使 mongoose 方法以与实现 shell 帮助程序方法大致相同的方式“在幕后”执行此操作。

关于javascript - 为什么用 $addToSet 更新总是返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313525/

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