#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