MongoDB 在指针引用上使用 $group 和 $count 聚合管道 returns 错误数据

MongoDB Aggregate pipeline with $group and $count on a Pointer reference returns wrong data

我在 MongoDB 中有一组数据 parse-server 格式如下-

 Rating => objectId, user<_User>, rating...
 _User => objectId, gender<m|f|nb|na>

我一直在尝试根据用户的性别对数据进行分组,以了解有多少男性、女性、非二元性别或 N/A 用户进行了评分。指向 _User 的指针引用中的 user 字段。我正在使用以下聚合管道。

const pipeline = [
      {
        lookup: {
          from: '_User',
          localField: 'user',
          foreignField: 'objectId',
          as: 'user'
        }
      },
      {
        unwind: { path: '$user' }
      },
      {
        group: {
          objectId: '$user.gender',
          count: {
            $sum: 1
          }
        }
      }
    ]
const data = await new Query('Rating').aggregate(pipeline)

结果=>

[
        {
            "count": 54,
            "objectId": "na"
        },
        {
            "count": 405,
            "objectId": null
        },
        {
            "count": 27,
            "objectId": "f"
        },
        {
            "count": 540,
            "objectId": "m"
        }
    ],

但是,返回的数据计数与实际数据不匹配。 实际数据库只有27个评分1 f, 2 na, 24 m.

对于 MongoDB 开发人员,objectId 等同于 _id

我是聚合框架的新手。我做错了什么?

服务器环境- 解析服务器:3.2.3 mongodb: 4.0.2

这很棘手,因为您需要了解 Parse Server 如何在 MongoDB 中存储数据。以下查询应该可以解决您的问题:

  const query = new Parse.Query('Rating');

  const pipeline = [
    {
      project: {
        objectId: 1,
        userId: { $substr: ['$_p_user', '_User$'.length, -1] }
      }
    },
    {
      lookup: {
        from: '_User',
        localField: 'userId',
        foreignField: '_id',
        as: 'user'
      }
    },
    {
      unwind: { path: '$user' }
    },
    {
      group: {
        objectId: '$user.gender',
        count: {
          $sum: 1
        }
      }
    }
  ];

  return await query.aggregate(pipeline, { useMasterKey: true });