findOneAndUpdate в mongoose с ошибкой $ inc в первый раз, затем работает в следующих попытках

#node.js #mongoose

#node.js #мангуст

Вопрос:

findOneAndUpdate не работает и выдает сообщение об ошибке «параметр обновления должен быть объектом»

Используемые версии: Сервер Mongod- драйвер Mongodb 4.0.6 -3.0.5 Mongoose — Узел 5.5.1 -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_modulesmongoosenode_modulesmongodb-coreliberror.js:43:12)
    at toError (node_modulesmongoosenode_modulesmongodblibutils.js:149:22)
    at Collection.findOneAndUpdate (node_modulesmongoosenode_modulesmongodblibcollection.js:1552:11)
    at NativeCollection.(anonymous function) [as findOneAndUpdate] (node_modulesmongooselibdriversnode-mongodb-nativecollection.js:158:28)
    at NativeCollection.Collection.doQueue (node_modulesmongooselibcollection.js:126:30)
    at immediate (node_modulesmongooselibcollection.js:86:24)
    at process._tickCallback (internal/process/next_tick.js:61:11)
  driver: true,
  name: 'MongoError',
  [Symbol(mongoErrorContextSymbol)]: {} }

 

Схема:

 {_id:"URLShorteningIdentifier", sequence :1}
 

Комментарии:

1. Можете ли вы также опубликовать трассировку стека ошибок, а также схему вашей коллекции? Не видите проблему в запросе?

2. в моей локальной базе данных есть структура для реализации этого счетчика, и я не использую какую-либо схему из mongoose, поскольку у меня уже есть коллекция с созданными там документами. @HaroonKhan Я обновил журнал ошибок. {_id:»URLShorteningIdentifier»}

3. БД и коллекция уже созданы, поэтому просто хотелось использовать счетчик для получения следующей последовательности findOneAndUpdate . это должно работать правильно?

Ответ №1:

Я могу воспроизвести эту проблему, когда findOneAndUpdate вызывается до того, как соединение с MongoDB было полностью настроено (то есть до того, как соединение выдало open событие).

Внутренне Mongoose помещает команды в очередь до тех пор, пока не будет установлено соединение, и «воспроизводит» эти команды, когда соединение установлено.

Однако это не удается (в данном случае), когда вы используете методы, предоставляемые базовым драйвером MongoDB, например, тот findOneAndUpdate , который вы используете. В этом случае аргументы для команды не помещаются в очередь должным образом, и когда они воспроизводятся из очереди, выдается ошибка.

Я не уверен, является ли это ошибкой или просто следствием прямого использования метода драйвера. Этого не происходит, когда вы используете Mongoose findOneAndUpdate ( Model.findOneAndUpdate() ).

В качестве альтернативы, подождите, пока соединение не будет открыто, прежде чем выдавать команды.

Комментарии:

1. Спасибо @robertklep ! Похоже, эта проблема возникла из-за использования драйвера mongo. После использования модели mongoose проблема исчезла. : D