Mongodb 根据不同条件执行不同的操作

话说,某游戏公司部分服务器崩了,造成了玩家不好的游戏体验,为了挽留用户,该公司要给所在崩的服务器玩家给予补偿金币,补偿规则为:

  1. 活跃度 >= 20 的,补偿 100w 金币
  2. 活跃度 >= 30 的,补偿 200w 金币
  3. 活跃度 >= 50 的,补偿 600w 金币
  4. 活跃度 >= 70 的,补偿 800w 金币
  5. 活跃度 = 100 的,补偿 1200w 金币
  6. 当天登录的玩家额外补偿传说装备一件
  7. 更多......

玩家表:players 现有数据:

bulkWrite

遇到此类场景,想必大部分同学第一时间想到的是在程序里分配多个条件,执行多次修改,如代码:

javascript 复制代码
// === 活跃度 >= 20 ===
db.players.updateMany(
    { activity: { $gte: 20, $lt: 30 } }, {$set: {compensation: 1000000 }},
)
// === 活跃度 >= 30 ===
db.players.updateMany(
    { activity: { $gte: 30, $lt: 50 } }, {$set: {compensation: 2000000 }},
)
// === 活跃度 >= 50 ===
db.players.updateMany(
    { activity: { $gte: 50, $lt: 70 } }, {$set: {compensation: 6000000 }},
)
// === 活跃度 >= 70 ===
db.players.updateMany(
    { activity: { $gte: 70, $lt: 100 } }, {$set: {compensation: 8000000 }},
)
// === 活跃度 = 100 ===
db.players.updateMany(
    { activity: { $eq: 100 } }, {$set: {compensation: 12000000 }},
)
// === 当前登录 ===
db.players.updateMany(
    { lastLoginTime: { $lte: 1739132800000, $gte: 1646905200004  } },
    { $set: { advancedEquipment: "传说装备礼盒" }},
)

更好的做法 bulkWrite

上述做法固然可以,也算是常规操作,不过存在的问题就是执行了多次数据库操作,通常这种场景下是执行脚本,如果数据量特别大的话,那么则需要分批(假设有 100w 用户,一次刷 1000 条,那么需要执行 1000 * 6 = 6000 次修改),耗时会长一些。

还有一种做法使用 Mongodb bulkWrite,数据库本身执行多次操作会有一定的优化,使用如下:

javascript 复制代码
db.players.bulkWrite([
	{ updateMany: { filter: { activity: { $gte: 20, $lt: 30 } }, update: {$set: {compensation: 1000000 }}} },
	{ updateMany: { filter: { activity: { $gte: 30, $lt: 50} }, update: {$set: {compensation: 2000000 }}} },
	{ updateMany: { filter: { activity: { $gte: 50, $lt: 70} }, update: {$set: {compensation: 6000000 }}} },
	{ updateMany: { filter: { activity: { $gte: 70, $lt: 100} }, update: {$set: {compensation: 8000000 }}} },
	{ updateMany: { filter: { activity: { $eq: 100} }, update: {$set: {compensation: 12000000 }}} },
	{ updateMany: { filter: { lastLoginTime: { $lte: 1739132800000, $gte: 1646905200004  } }, update: {$set: { advancedEquipment: "传说装备礼盒" }}} },
])

最后

以上是作者认为好一点的做法,利用了 Mongodb 自带的一些函数,不好的地方就是 Mongodb 的函数和操作符太多了,不是每个小伙伴都熟知的,如果批量修改的操作不是很多的话,用程序执行多次操作也是可以的,毕竟现在利用线程池,执行一次 io 的效率也是可以的。

OK,如果对你有所启发,帮助到你,欢迎点赞、关注、收藏、评论哟

相关推荐
strength_zhou20131 天前
Python检查MongoDB索引列中的字段是否存在
python·mongodb
笔墨登场说说2 天前
mongodb备份
mongodb
笨鸟先飞的橘猫4 天前
mongodb面试题
数据库·mongodb
JLWcai202510096 天前
核电打磨 “安全卫士”|金利威不锈钢专用树脂砂轮,合规高效双在线
mysql·mongodb·eureka·sqlite·rabbitmq·nosql·memcached
学生哥-_-6 天前
STC8H1K08单片机在Keil环境下各外设的配置及使用方法
单片机·嵌入式硬件·mongodb
todoitbo7 天前
MongoDB迁移:从烟囱式部署走向 KES-AI 时代融合数据库架构
人工智能·mongodb·数据库架构·国产数据库·kingbasees
一个天蝎座 白勺 程序猿7 天前
MongoDB迁移新范式|从烟囱式孤岛到KES-AI融合架构
人工智能·mongodb·架构·kingbasees
程序边界7 天前
从烟囱到融合:一次MongoDB迁移引发的架构重构深思
mongodb·重构·架构
霖霖总总9 天前
[MongoDB小技巧29]MongoDB PITR 深度工程化:从全量备份到“任意时间点”精准回滚
数据库·mongodb
霖霖总总9 天前
[MongoDB小技巧30]MongoDB 数据生命周期管理完全指南:从 TTL 索引到冷热分离归档
数据库·mongodb