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

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

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

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

示例:

  • 中奖号码 - 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/02F-vER_yEV

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": {
        userId: "$$e.userId",
        "dateSubmitted": "$$e.dateSubmitted",
        lotteryMatchingCount: {
          $size: {
            "$setDifference": [
              "$$e.lotteryNumber",
              {
                "$setDifference": [
                  "$$e.lotteryNumber",
                  [
                    1,
                    2,
                    3
                  ]
                ]
              }
            ]
          }
        }
      }
    }
  }
}
}
])

游乐场

解释:

  1. 最好将数字作为数组,以便在 mongoDB 中更容易,不知道为什么在字符串中添加示例...

  2. 仅匹配至少包含一个匹配彩票号码的文档。 (减少文件量)

  3. 映射所有用户并在名为“lotteryMatchingCount”的新变量中计算匹配彩票号码的计数

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