来自云代码的聚合管道不返回任何内容

时间:2019-01-28 18:36:59

标签: javascript mongodb aggregation-framework parse-server

在解析云代码上进行的聚合调用未提供所需的结果。我不确定这是否是我们使用的语法问题,还是我们需要一些丢失的东西才能使管道聚合调用正常工作。

对于所需的聚集调用,我们正在构建一个使用五个不同阶段的管道。在这五个阶段中,我们使用以下四个功能:addFieldslookupunwindgroup。已经在MongoDB罗盘应用程序上对此进行了测试,并且结果正确显示。导出聚合并将其转换为我们认为正确的语法后,该查询将不返回任何结果。

仅使用一个阶段的简单聚合管道可以正常工作。已针对group by和addField调用进行了测试。看来,一旦将多个阶段添加到管道中,就会出现故障。

从MongoDB Compass导出到Node直接生成的聚合调用如下

[
  {
    '$addFields': {
      'user': {
        '$substr': [
          '$_p_pUser', 6, -1
        ]
      }
    }
  }, {
    '$lookup': {
      'from': '_User', 
      'localField': 'user', 
      'foreignField': '_id', 
      'as': 'userobject'
    }
  }, {
    '$addFields': {
      'username': '$userobject.username'
    }
  }, {
    '$unwind': {
      'path': '$username'
    }
  }, {
    '$group': {
      '_id': '$username', 
      'total': {
        '$sum': '$score'
      }
    }
  }
]

上述调用转换为此处提供的语法(https://docs.parseplatform.org/js/guide/#aggregate)时,如下所示:

var pipeline = {
        addFields : { user: { $substr : ['$_p_pUser', 6, -1]} },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        addFields : { username: '$userobject.username' },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };
var pipelineResults = await gameTableQuery.aggregate(pipeline);

未提供结果。还使用特定的字段名称(pUser而不是_p_pUser(必须使用MongoDB Compass使查询正常工作)进行测试。

var pipeline = {
        addFields : { user: { $substr : ['$pUser', 6, -1]} },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        addFields : { username: '$userobject.username' },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };

可能的问题可能是addFields函数的重复。我也尝试过一次相同的调用,而是使用一个addFields调用。

var pipeline = {
        addFields : 
        { 
            user: { $substr : ['pUser', 6, -1]},
            username: '$userobject.username'
        },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };

这些调用是使用云代码完成的,并且不会返回在MongoDB Compass中找到的所需结果。不会因语法而引发任何错误,只是没有结果。解析聚合调用中是否有任何限制可以解释调用失败的原因?

1 个答案:

答案 0 :(得分:0)

问题似乎出在子字符串调用上。

在MongoDB指南针中,为pUser字段分配了一个值,该值需要修整才能访问objectId。 当尝试从解析云代码聚合中执行相同操作时,由于pUser包含objectId作为子元素,因此不需要进行修剪。

要访问我正在使用的objectId

user : '$pUser.objectId'

代替

user : { $substr : ['pUser', 6, -1]}