使用游标或解释时,MongoDB聚合崩溃

时间:2018-06-22 04:21:28

标签: mongodb aggregation-framework

从3.6版开始,MongoDB要求在cursor查询中使用explainaggregate。这是一项重大更改,因此我必须修改我之前的代码。

但是,当我向查询中添加cursorexplain时,请求只是进入一个无限循环,而MongoDB则从不响应。甚至似乎都没有超时。

这种简单的聚合只会挂起代码,而不会响应:

db.collection('users').aggregate([{ $match: { username: 'admin' }}],
                                  { cursor: {} },
                                  (err, docs) => {
                                       console.log('Aggregation completed.');
                                  });

我可以将{ cursor: {} }替换为{ explain: true },结果是相同的。如果没有此参数,它可以在MongoDB的较早版本中完美运行。

如果没有cursorexplain,我会收到此错误消息:

The 'cursor' option is required, except for aggregate with the explain argument

我不是唯一遇到这个问题的人: https://github.com/nosqlclient/nosqlclient/issues/419

1 个答案:

答案 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团队所做的所有额外工作!猜猜这就是我完成您的产品的地方。