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



从3.6版本开始,MongoDB要求在aggregate查询中使用cursorexplain。这是一个重大更改,所以我必须修改我以前的代码。

但是当我向查询添加cursorexplain时,请求只是进入一个无限循环,MongoDB 永远不会响应。它甚至似乎没有超时。

这个简单的聚合只是挂起代码,从不响应:

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

我可以用{ explain: true }替换{ cursor: {} },结果是一样的。它在没有这个参数的旧 MongoDB 版本下完美运行。

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

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

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

好吧,这有点棘手,但最终它起作用了。看起来MongoDB的Node.js驱动程序中有一些重大的重大重大重大更改,没有人费心告诉我。

1.Node.js MongoDB驱动程序必须升级。我当前的版本是 3.0.7。

2.MongoDB的连接方式发生了变化,破坏了任何旧代码。客户端连接现在返回客户端对象,而不仅仅是数据库。它必须以不同的方式处理。有一个SO答案完美地解释了它:

db.collection在使用MongoClient v3.0时不是一个函数

3.聚合现在返回一个AggregationCursor对象,而不是一个数据数组。现在你必须迭代它,而不是回调。

var cursor = collection.aggregate([ ... ], 
{ cursor: { batchSize: 1 } });
cursor.each((err, docs) => {
...
});

因此,在升级到MongoDB 3.6后,您似乎必须重写所有数据库操作。是的,感谢所有额外的工作,MongoDB团队!猜猜这就是我对你的产品完成的地方。

最新更新