【问题标题】:Aggregation issue with Mongo 3.6Mongo 3.6 的聚合问题
【发布时间】:2018-08-18 20:54:22
【问题描述】:

我在连接 3.4 mongodb 时使用聚合函数没有任何问题。

当我更改为 3.6 分贝时,

我收到消息:'cursor' 选项是必需的,但带有解释参数的聚合除外。

对不起,如果它已经发布。我找不到任何解决方案

【问题讨论】:

  • 请发布您使用的代码,以及您的驱动程序的版本。从 2.6 开始,MongoDB 聚合返回一个游标。此错误表示您必须通过 cursor 选项,这可能意味着您的驱动程序已过时。
  • 我刚刚安装了mogodb。所以我会说最新版本的 mongodb。

标签: node.js mongodb mongodb-query aggregation-framework loopbackjs


【解决方案1】:

在 mongo 3.6 中,使用聚合时必须使用游标,除非包含解释选项,否则必须指定游标选项。我遇到了和你一样的错误。现在你必须这样做

this.aggregate( [
        { $unwind : "$tags" },
        {$group: {_id: '$tags', count: { $sum: 1} }},
        {$sort: { count: 1 }}
            ] ).cursor({}).exec();

现在您可以使用游标方法 cursor.toArray() 返回一个包含游标中所有文档的数组。聚合返回的游标只支持对cursor.toArray()等求值游标进行操作的游标方法,更多游标方法可以点击here进一步了解。

【讨论】:

    【解决方案2】:

    在 Node.js 中,将 MongoDB 从 3.4 升级到 3.6 后,需要检查两件事:

    1. 在聚合语句中添加cursor: {} 选项。在以前的 MongoDB 版本中,这是可选的(当然,您可以根据需要在游标对象中定义 batchSize)。例如:

      db.collection(collectionName).aggregate(pipelineArray, {
        cursor: {}
      }, function(error, result) {
        ...
      });
      
    2. 如果上述代码挂起,回调没有被调用,请检查mongodb驱动版本。我在mongodb 模块 v2.2.16 中遇到了这个“无响应”问题。将mongodb升级到v2.2.35后,已修复。

    【讨论】:

      【解决方案3】:

      对于那些试图在 3.6 上找出完整示例的人来说,这对我有用:

      function aggregateLoad(db, collectionName, lookUpOption, matchOption, callback) {
              var defCursor = {};
              var cursor = db.collection(collectionName).aggregate([
                  {
                      $lookup: lookUpOption
                  },
                  {
                      $match: matchOption
                  }
              ],defCursor,null);
              cursor.toArray(function(err, docs) {
                  console.log("Some data: ", docs);
                  callback(err, docs);
                  db.close();
              });
      

      }

      那么你可以调用上面的函数:

      function testAggregateLoad(someId, callback) {
              var match = {
                  "localId": someId
              };
              var aggregateQuery = {
                  from: "someSecondCollectionName",
                  localField: "localId",
                  foreignField: "_id",
                  as: "someData"
              };
              getConnection(conCallBackEx);
              function conCallBackEx(db) {
                 aggregateLoad(db, "someBaseLoadCollection", aggregateQuery, match, onSuccess);
              }
              function onSuccess(err, json) {
                  console.log('Loaded data is ', json);
                  callback(json);
              }
          }
      
      
      
      function getConnection(callback) {
              var MongoClient = require('mongodb').MongoClient;
              return MongoClient.connect(url, function (err, db) {
                  if (null === err) {
                      callback(db, err);
                  } else {
                      console.log("failed to get db connection retrying  " + err);
                      getConnection(callback);
                  }
              });
          }
      

      【讨论】:

      • aggregate(...).toArray 不是函数
      猜你喜欢
      • 2018-07-15
      • 2015-11-18
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2019-01-14
      相关资源
      最近更新 更多