gpt4 book ai didi

node.js - 如何使用更新插入行为正确更新文档? (Mongo 漏洞 SERVER-10711)

转载 作者:可可西里 更新时间:2023-11-01 09:43:15 28 4
gpt4 key购买 nike

我正在尝试更新具有 如果找到更新,否则插入 的文档。

这是我正在尝试的东西(使用使用 monodb Node 驱动程序的 sails waterline ORM):

var roundPoints = 93;
var lfPoints = 10 + roundPoints;
var lineUpPointsGeneralRecord = {
round: 0,
teamId: "real-madrid-9248",
totalPoints: roundPoints,
teamName: "minuto93",
userId: "bbc1902",
userName: "Risas Pizza",
signupPoints: 10,
lfPoints: lfPoints
};

LineupPointsRecord.native(function (err,collection) {
collection.update(
{teamId: lineUpPointsGeneralRecord.teamId, round: 0},
{
$setOnInsert: lineUpPointsGeneralRecord,
$inc: {lfPoints: roundPoints},
$push: {roundPoints: roundPoints}
},
{upsert: true},
function (err,updateResult) {
sails.log.debug(err,updateResult);
});
});

但是提示失败了:

code: 16836,
err: 'Cannot update \'lfPoints\' and \'lfPoints\' at the same time' } null

我做错了什么?

编辑

This seems to be a known issue.但我真的不想结束实现解决方法。我该如何应对?

最佳答案

错误发生是因为当一个“upsert”同时发生时 $setOnInsert$inc以及 $push操作都试图在文档中设置项目。由于错误报告,您不能在一次更新中使用两个不同的运算符修改文档的相同属性。

然后解决方案是“分离”更新,这样只有一个操作“仅”执行 $setOnInsert,而另一个将执行匹配文档的其他更改。最好这样做的方法是使用 Bulk Operations以便所有请求立即发送到服务器:

LineupPointsRecord.native(function (err,collection) {

var bulk = collection.initializeOrderedBulOp();

// Match and update only. Do not attempt upsert
bulk.find({
"teamId": lineUpPointsGeneralRecord.teamId,
"round": 0
}).updateOne({
"$inc": { "lfPoints": roundPoints },
"$push": { "roundPoints": roundPoints }
});

// Attempt upsert with $setOnInsert only
bulk.find({
"teamId": lineUpPointsGeneralRecord.teamId,
"round": 0
}).upsert().updateOne({
"$setOnInsert": lineUpPointsGeneralRecord
});

bulk.execute(function (err,updateResult) {
sails.log.debug(err,updateResult);
});
});

由于第二个操作只会在文档不匹配的地方尝试更新插入,因此没有冲突,因为没有其他操作。在第一个操作中,这将“仅”在文档“匹配”的地方进行更改,并且由于此处没有尝试更新插入,因此也没有冲突。

确保您的 sails-mongo是支持批量操作的最新版本,包含最新的 Node native 驱动程序。最新的支持 v2 驱动程序,这很好。

关于node.js - 如何使用更新插入行为正确更新文档? (Mongo 漏洞 SERVER-10711),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020630/

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