Mongodb 如何防止updateOne自动插入{';$set';:{u id:';foobaa';},?
我只想将adActive.viewCnt增加一个 这是我的密码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
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'
导出什么?