如何防止updateOne自动插入{$set':{_id:'foobaa'}},?



我只想把adActive.viewCnt增加一个。

这是我的代码

let adActiveModel = require('../models/adActiveModel');
let adActiveTable = mongoose.model('adActiveModel');
// Increment of viewCnt 
await adActiveTable.updateOne(
{ "_id" : adActiveTable._id },
{ $inc: { "viewCnt" : 1 } }
);

但出于某种原因,mongodb会这样做:

Mongoose: adActive.updateOne({ _id: 's0171' }, { '$set': { _id: 's0171' } }, { '$inc': { viewCnt: 1 } })

这不起作用,{"$set":{_id:"s0171"}}使其不起作用如果我将该行复制到S3T并按原样执行,则不会发生任何事情。但是,如果我删除{'$set':{_id:'s0171'}}并只执行

db.adActive.updateOne({ _id: 's0171' }, 
{ '$inc': { viewCnt: 1 } })

然后它工作得很好。

为什么Mongoose插入{'$set':{_id:'s0171'}}

我该如何预防?

有没有更好的方法可以将一个数字字段增加1?

由于您正在尝试使用adActiveTable._id进行更新,我将假设adActiveTable是一个文档而不是模型。如果我们查看Document.prototype.updateOne的文档,它会指出

发送updateOne命令,并将this document_id作为查询选择器。

(强调矿(

我们还可以看到,updateOne的第一个参数已经是更新文档。这意味着mongoose将{ "_id" : adActiveTable._id }解释为调用的更新部分,并在预处理中在其周围添加$set运算符

要解决此问题,您可以忽略呼叫的第一个参数:

await adActiveTable.updateOne(
{ $inc: { "viewCnt" : 1 } }
);

如果您尚未提取文档,可以使用Model.findOneAndUpdate或Model.updateOne。

最新更新