Mongodb 如何防止updateOne自动插入{';$set';:{u id:';foobaa';},?

Mongodb 如何防止updateOne自动插入{';$set';:{u id:';foobaa';},?,mongodb,Mongodb,我只想将adActive.viewCnt增加一个 这是我的密码 let adActiveModel = require('../models/adActiveModel'); let adActiveTable = mongoose.model('adActiveModel'); // Increment of viewCnt await adActiveTable.updateOne( { "_id" : adActiveTable._id

我只想将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':{{u id:'s0171'}}使它不起作用 如果我将该行复制到S3T并按原样执行,则不会发生任何事情。 但是如果我删除{'$set':{{u id:'s0171'}}并且只执行

    db.adActive.updateOne({ _id: 's0171' }, 
    { '$inc': { viewCnt: 1 } })
那么它工作得很好

为什么猫鼬要插入{'$set':{u id:'s0171'}

我如何预防它


是否有更好的方法将一个数字字段增加1?

因为您正在尝试使用
adActiveTable.\u id
对于更新,我将假设
adActiveTable
是一个文档而不是一个模型。如果我们看看它的状态

发送一个updateOne命令,该命令使用此文档_id作为查询选择器

(强调矿山)

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

要解决此问题,只需省略调用的第一个参数:

wait adActiveTable.updateOne(
{$inc:{“viewCnt”:1}
);

如果尚未获取文档,则可以使用或。

我认为updateOne可以使用{“\u id”:adActiveTable。\u id}查找它要更新的记录。根据你的想法,我需要先做一个find{{“\u id”:adActiveTable.\u id}},然后再做一个updateOne。没有办法同时做这两件事吗?adActiveTable实际上是一个模型——让我把它添加到我的queston-let-adActiveModel=require(“../models/adActiveModel”);让adActiveTable=mongoose.model('adActiveModel');那么,
adActiveTable
的类型是什么?你正在访问它的
\u id
属性,就像你已经有了一个文档一样。我更改了wait-adActiveTable.updateOne(改为wait-adActiveModel.updateOne(然后它工作了?!奇怪……我想它更喜欢模型而不是文档。无论如何,你让我走上了正确的轨道:)原因是您现在使用的是不同的
更新One
。我将文档添加到了anwer中。您从
'../models/adActiveModel'
导出什么?