如何使用 MongoDB 在对象数组中查找和计算 4 位数字(即彩票号码)的匹配数量

问题描述 投票:0回答:1

我正在创建某种彩票游戏,用户可以提交 1-9 之间的 4 位数字(例如“1、4、5、8”)。然后游戏以使用 Math.random 的获胜 4 位数字结束。

我需要做的是找到每个用户的匹配数,并确定其中谁获得了 1 个匹配、2 个匹配、3 个匹配和 4 个匹配。

示例:

  • 中奖号码 - 1, 2, 3, 4
  • 用户:Josh(12、7、9 获得 2 场比赛)
  • 用户:Ryan(431,6 获得 3 场比赛)
  • 用户:Angelo (5,6,7,9 获得 0 场比赛)

如何使用 MongoDB 聚合执行此操作?

这是 mongo Playground 的链接,其中包含该集合:https://mongoplayground.net/p/A_pnXOrsA8E

javascript node.js mongodb aggregate
1个回答
0
投票

也许您正在寻找这样的东西:

db.collection.aggregate([
{
 $match: {
  "entries.lotteryNumber": {
    $in: [
      1,
      2,
      3
    ]
   }
  }
 },
{
 "$addFields": {
  "entries": {
    "$map": {
      "input": "$entries",
      "as": "e",
      "in": {
        "$mergeObjects": [
          "$$e",
          {
            lotteryMatchingCount: {
              $size: {
                "$setDifference": [
                  "$$e.lotteryNumber",
                  {
                    "$setDifference": [
                      "$$e.lotteryNumber",
                      [
                        1,
                        2,
                        3
                      ]
                    ]
                  }
                ]
              }
            }
          }
        ]
      }
     }
    }
   }
  }
])

假设: 如果您将数字作为数组在 mongoDB 中更容易使用,那么最好将数字保留为字符串,这不是最佳实践(也不确定为什么用户在条目数组中而不是在单个文档中(单个文档在 mongoDB 中的限制为 16MB,如果您有2000万用户申请抽奖?) (不太清楚最终结果需要是什么样子,也许如果你提供更多细节我可以相应调整?)

游乐场

解释:

  1. 仅匹配至少包含一个匹配彩票号码的文档。 (减少enxt阶段的文档数量,如果您需要修改所有文档以显示匹配数,则可以删除此阶段)

  2. 遍历条目内的用户并计算名为“lotteryMatchingCount”的新变量中匹配彩票号码的计数

© www.soinside.com 2019 - 2024. All rights reserved.