匹配文档的字段不包含 $group 中的值

Match documents with fields not containing values in $group

我有一个看起来像这样的集合:

{
    id: 1
    user: 1
    gameCategory: aaa/traditional
    gameName: Artifact
},
{
    id: 2
    user: 1
    gameCategory: web3
    gameName: Axie Infinity
},
{
    id: 3
    user: 2
    gameCategory: aaa/traditional
    gameName: League of Legends
},
...

单个文档表示用户在玩游戏。我如何找到以下用户组:

我的想法是运行 $group stage with user & gameCategory,然后用$match什么的过滤掉同时玩其他类别游戏的用户

编辑: 这里有很多选项。这是一个简单的:

  1. 我们使用 $group 为每个用户存储其 gameCategory,同时也检查他们是否在玩其他游戏,因此填写 other。这允许我们仅在 groupType 上存储 gameCategory 这是组的键
  2. 如果groupType只包含一个密钥,则为组密钥,否则为'both'
  3. 仅当 other 键为空时才成立。
  4. $group by groupType 聚合组
  5. 的用户
db.collection.aggregate([
  {
    $group: {
      _id: "$user",
      other: {
        $addToSet: {
          $cond: [
            {$and: [{$ne: ["$gameCategory", "web3"]},
                    {$ne: ["$gameCategory", "aaa/traditional"]}]
            }, "true", "$$REMOVE"]
        }
      },
      groupType: {
        $addToSet: {
          $cond: [
            {$or: [{$eq: ["$gameCategory", "web3"]},
                   {$eq: ["$gameCategory", "aaa/traditional"]}]
            }, "$gameCategory", "$$REMOVE"]
         }
      }
    }
  },
  {
    $project: {
      other: {$size: "$other"},
      groupType: {
        $cond: [{$eq: [{$size: "$groupType"}, 1]}, {$arrayElemAt: ["$groupType", 0]},
          "both"
        ]
      }
    }
  },
  {$project: {groupType: {$cond: [{$eq: ["$other", 1]}, "other",  "$groupType"]}}},
  {$group: { _id: "$groupType",  users: {$push: "$_id"}}}
])

Playground