首页 文章

使用cursor或explain时,MongoDB聚合崩溃

提问于
浏览
1

从版本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

1 回答

  • 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团队!猜猜我已经完成了你的产品 .

相关问题