bucketAggregation Framework(MongoDB)中的自动和查找

k10s72fa  于 2023-04-29  发布在  Go
关注(0)|答案(1)|浏览(90)

bounty还有5天到期。回答此问题可获得+50声望奖励。powerPixie希望引起更多关注这个问题。

我有两个收藏,一个是给在线的人,另一个是给有账号的玩家。我想知道有多少玩家的帐户在线。在3个匹配字段(last_name或email或first name或移动的phone)中出现肯定识别,我使用的是bucketAuto方法。代码如下

{
  from: "players",
  let: {
    last_name: "$last_name",
    email: "$email",
    first_name: "$first_name",
    mobile: "$mobile",      
  },
  pipeline: [
  {
      $bucketAuto:
       {groupBy:{
                "$size": {
                "$setIntersection": [
                  [
                    "$$last_name",
                    "$$email",
                    "$$first_name",
                    "$$mobile"
                  ],
                  [
                    "$last_name",
                    "$email",
                    "$first_name",
                    "$mobile"
                  ],
                ]},
            },          
         buckets:5           
    }
  }    
  ],
  'as': "matches",
}

#This is the model of the resulting output:

matches
0 Object
_id Object
count
5043

1 Object
_id
Object
count
4

我知道5043代表一个文档的所有不匹配,4是目标文档的匹配数量。
我的目的是得到这样的东西:

matches
0 Object
_id 0
count
5043

1 Object
_id 1
count
1

2 Object
_id 2
count
3

3 Object
_id 3
count
0

4 Object
_id 4
count
4

group _id应该是bucketAuto阶段中与其相应计数器的交叉点的数量。

Sample data:
{
  "last_name": "Hansen",
  "first_name": "Dawn",
  "email": "hdawn@email.com",
  "mobile": "+352000900"
}

我已经表达了期望的输出,说“我的意图是得到类似的东西。..”

ulmd4ohb

ulmd4ohb1#

您的解决方案基本上是将一个集合上的每个文档与另一个集合上的每个文档进行比较,因此考虑到效率并根据您的目的,我建议以$match步骤开始管道。然后我们可以继续交集测试,但我们只对具有3个或更多匹配字段的文档感兴趣,并且对于每个字段,只有最佳匹配是相关的:

db.online.aggregate([
  {$lookup: {
      from: "players",
      let: {
        last_name: "$last_name",
        email: "$email",
        first_name: "$first_name",
        mobile: "$mobile"
      },
      pipeline: [
        {$match: {$expr: {$or: [
                {$eq: ["$email", "$$email"]},
                {$eq: ["$mobile","$$mobile"]}
        ]}}},
        {$project: {
            _id: 0,
            matchFieldsCount: {
              $size: {$setIntersection: [
                  [
                    "$$last_name",
                    "$$email",
                    "$$first_name",
                    "$$mobile"
                  ],
                  [
                    "$last_name",
                    "$email",
                    "$first_name",
                    "$mobile"
                  ]
              ]}
            }
        }},
        {$match: {matchFieldsCount: {$gte: 3}}},
        {$sort: {matchFieldsCount: -1}},
        {$limit: 1}
      ],
      as: "matches"
  }},
  {$set: {matches: {$first: "$matches"}}},
  {$bucketAuto: {groupBy: "$matches.matchFieldsCount", buckets: 3}}
])

了解它在playground example上的工作原理

相关问题