node.js - 猫鼬中的 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}
解决方案
在与 MongoDB 的连接完全建立之前(因此在连接发出事件之前findOneAndUpdate
)被调用时,我可以重现此问题。open
在内部,Mongoose 将命令排队,直到建立连接,并在连接建立时“重播”这些命令。
但是,当您使用底层 MongoDB 驱动程序提供的方法时,这会失败(在这种情况下),例如您使用的方法findOneAndUpdate
。在这种情况下,命令的参数没有正确排队,当它们从队列中重放时,会引发错误。
我不确定这是一个错误还是直接使用驱动程序方法的结果。findOneAndUpdate
使用 Mongoose 的( Model.findOneAndUpdate()
)时不会发生这种情况。
或者,等到连接打开后再发出命令。
推荐阅读
- python - 如何通过 Selenium 和 Python 根据网站单击文本为 LOGIN 的元素?
- python - 通过 Python 到 Instagram 的 API 调用中标题元素“x-instagram-ajax”的目的是什么?
- angular - 角度2 jsPDF。属性数据未反映在 PDF 中
- scala - 在 Scala 中使用 sc.textFiles 解析巨大的多行压缩文件
- c++ - concurrency::streams 与 std::Xstreams 有什么区别?
- identityserver4 - 获取客户端的身份令牌
- delphi - Spring4D最新不兼容DSharp?
- class - 在pyreverse生成的类图中隐藏成员变量
- python - 在 python tkinter 中添加到每帧的计数器以进行测验?
- vba - 在字符串的特定区域内添加引号