从版本3.6开始,MongoDB需要在 aggregate
查询中使用 cursor
或 explain
. 这是一个重大变化所以我必须修改我之前的代码 .
但是当我将 cursor
或 explain
添加到我的查询中时,请求只是进入无限循环而MongoDB从不响应 . 它似乎没有超时 .
这个简单的聚合只会挂起代码而永远不会响应:
db.collection('users').aggregate([{ $match: { username: 'admin' }}],
{ cursor: {} },
(err, docs) => {
console.log('Aggregation completed.');
});
我可以用 { explain: true }
替换 { cursor: {} }
,结果是一样的 . 它在没有这个参数的旧版MongoDB下完美运行 .
没有 cursor
或 explain
我收到此错误消息:
The 'cursor' option is required, except for aggregate with the explain argument
我不是唯一碰到这个的人:https://github.com/nosqlclient/nosqlclient/issues/419
1 回答
好吧,这有点棘手,但最后还是有效的 . 看起来MongoDB的Node.js驱动程序有一些重大的重大变化,没有人打扰告诉我 .
1. 必须升级Node.js MongoDB驱动程序 . 我目前的版本是3.0.7 .
2. MongoDB如何连接的方式已经改变,破坏了任何旧代码 . 客户端连接现在返回客户端对象,而不仅仅是db . 它必须以不同的方式处理 . 有一个SO答案完美地解释它:
db.collection is not a function when using MongoClient v3.0
3. 聚合现在返回
AggregationCursor
对象,而不是数据数组 . 现在你必须迭代它而不是回调 .因此,在升级到MongoDB 3.6之后,您似乎必须重写所有数据库操作 . 是的,感谢所有额外的工作,MongoDB团队!猜猜我已经完成了你的产品 .