首页 > 解决方案 > 猫鼬中的 findOneAndUpdate 与 $inc 第一次失败然后在下一次尝试中工作

问题描述

findOneAndUpdate 不起作用并抛出错误消息'更新参数必须是一个对象'

使用的版本:Mongod server- 4.0.6 Mongodb driver -3.0.5 Mongoose - 5.5.1 Node -10.15.x

let incrementCount=1;
//dbColl is mongoose.connection.collection((String)(collectionName));
    dbColl=getDb(collectionName);
    return dbColl.findOneAndUpdate({
        _id:"URLShorteningIdentifier"
    },
    {
        $inc:{
            sequence : incrementCount
        }
    }
    ,
    {
        returnOriginal:false
    }
    )

以下是堆栈跟踪:

{ MongoError: update parameter must be an object
    at Function.create (\node_modules\mongoose\node_modules\mongodb-core\lib\error.js:43:12)
    at toError (\node_modules\mongoose\node_modules\mongodb\lib\utils.js:149:22)
    at Collection.findOneAndUpdate (\node_modules\mongoose\node_modules\mongodb\lib\collection.js:1552:11)
    at NativeCollection.(anonymous function) [as findOneAndUpdate] (\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:158:28)
    at NativeCollection.Collection.doQueue (\node_modules\mongoose\lib\collection.js:126:30)
    at immediate (\node_modules\mongoose\lib\collection.js:86:24)
    at process._tickCallback (internal/process/next_tick.js:61:11)
  driver: true,
  name: 'MongoError',
  [Symbol(mongoErrorContextSymbol)]: {} }

架构:

{_id:"URLShorteningIdentifier", sequence :1}

标签: node.jsmongoose

解决方案


在与 MongoDB 的连接完全建立之前(因此在连接发出事件之前findOneAndUpdate)被调用时,我可以重现此问题。open

在内部,Mongoose 将命令排队,直到建立连接,并在连接建立时“重播”这些命令。

但是,当您使用底层 MongoDB 驱动程序提供的方法时,这会失败(在这种情况下),例如您使用的方法findOneAndUpdate。在这种情况下,命令的参数没有正确排队,当它们从队列中重放时,会引发错误。

我不确定这是一个错误还是直接使用驱动程序方法的结果。findOneAndUpdate使用 Mongoose 的( Model.findOneAndUpdate())时不会发生这种情况。

或者,等到连接打开后再发出命令。


推荐阅读