从3.6版开始,MongoDB要求在cursor
查询中使用explain
或aggregate
。这是一项重大更改,因此我必须修改我之前的代码。
但是,当我向查询中添加cursor
或explain
时,请求只是进入一个无限循环,而MongoDB则从不响应。甚至似乎都没有超时。
这种简单的聚合只会挂起代码,而不会响应:
db.collection('users').aggregate([{ $match: { username: 'admin' }}],
{ cursor: {} },
(err, docs) => {
console.log('Aggregation completed.');
});
我可以将{ cursor: {} }
替换为{ explain: true }
,结果是相同的。如果没有此参数,它可以在MongoDB的较早版本中完美运行。
如果没有cursor
或explain
,我会收到此错误消息:
The 'cursor' option is required, except for aggregate with the explain argument
我不是唯一遇到这个问题的人: https://github.com/nosqlclient/nosqlclient/issues/419
答案 0 :(得分: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
对象,而不是数据数组。现在您不必遍历回调,而要遍历它。
var cursor = collection.aggregate([ ... ],
{ cursor: { batchSize: 1 } });
cursor.each((err, docs) => {
...
});
因此,似乎您必须在升级到MongoDB 3.6之后重写所有数据库操作。是的,感谢MongoDB团队所做的所有额外工作!猜猜这就是我完成您的产品的地方。