我正在创建某种彩票游戏,用户可以提交 1-9 之间的 4 位数字(例如“1、4、5、8”)。然后游戏以使用 Math.random 的获胜 4 位数字结束。
我需要做的是找到每个用户的匹配数,并确定其中谁获得了 1 个匹配、2 个匹配、3 个匹配和 4 个匹配。
示例:
如何使用 MongoDB 聚合执行此操作?
这是 mongo Playground 的链接,其中包含该集合:https://mongoplayground.net/p/A_pnXOrsA8E
也许您正在寻找这样的东西:
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万用户申请抽奖?) (不太清楚最终结果需要是什么样子,也许如果你提供更多细节我可以相应调整?)
解释:
仅匹配至少包含一个匹配彩票号码的文档。 (减少enxt阶段的文档数量,如果您需要修改所有文档以显示匹配数,则可以删除此阶段)
遍历条目内的用户并计算名为“lotteryMatchingCount”的新变量中匹配彩票号码的计数