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

Aggregate pipeline from cloud code not returning anything

对解析云代码进行的聚合调用未提供所需的结果。我不确定这是否是我们正在使用的语法的问题,或者是否有一些遗漏的东西我们需要让管道聚合调用正常工作。

对于所需的聚合调用,我们正在构建一个使用五个不同阶段的管道。在这五个阶段中,我们使用了以下四个函数:addFieldslookupunwindgroup。这已经在 MongoDB 指南针应用程序上进行了测试,结果显示正确。导出聚合并转换为我们认为正确的语法后,查询 return 没有结果。

仅使用一个阶段的简单聚合管道运行良好。这已经针对 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'
            }
        }
    };

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

问题似乎是子字符串调用引起的。

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

要访问 objectId 我现在使用的是:

user : '$pUser.objectId'

而不是

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