首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配不包含$group中值的字段的文档

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

Stack Overflow用户
提问于 2022-05-26 16:49:48
回答 1查看 30关注 0票数 0

我有一个像这样的收藏品:

代码语言:javascript
复制
{
    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
},
...

单个文档表示用户正在玩游戏。我如何找到这样一组用户:

  • 只玩“aaa/传统”小游戏
  • 只玩"web3“小游戏
  • 玩两种类型的游戏

我的想法是运行$group阶段与用户& gameCategory,并使用$match或其他东西过滤掉用户谁也玩其他类别的游戏

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 17:32:38

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

  1. 我们使用$group为每个用户存储其gameCategory,还可以检查他们是否在另一个游戏中玩,从而填充other。这允许我们只在groupType上存储作为组密钥的gameCategory
  2. 如果groupType只包含一个键,这是组键,否则是‘两者都’。
  3. 只有当other键为空时,才是正确的。
  4. 通过$group通过groupType和聚合组的用户
代码语言:javascript
复制
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"}}}
])

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72395336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档