首页 > 编程问答 >递减 MongoDB 值,防止出现负数

递减 MongoDB 值,防止出现负数

时间:2024-05-30 09:23:32浏览次数:30  
标签:mongodb mongodb-query atomic increment mongodb-update

我正在使用 MongoDB,我有一个文档,我想在其中递增一个计数字段。但是,我需要确保该计数不会低于零。例如,如果 inc 为-2,而当前计数为 1,那么应用 $inc 将导致计数为-1,而这正是我希望避免的。

以下是我当前使用的更新操作:

db.collection.updateMany(
  {'_id':{'$in': object_ids}},
  {
    '$inc':{ 'count': inc }、
    '$addToSet':{...},
    '$set':{...},
  }
)

我试过这两种方法,但由于"$addToSet "不能作为管道阶段添加,所以我无法使用以下方法:

db.collection.updateMany({ '_id':{'$in': object_ids}}, [ { $set:{ count:{ $cond: { if:{ $gte: [{ $add: ['$count', inc] }, 0] }.}, then:{ $add: ['$count', inc] }, else: 0 }}}}])

我还想到了使用

我还想到了使用

'$expr':{ '$gte': ['$count', 0] }
但这并不能防止递减为负数!


可以使用 MongoDB 4.2 中引入的 $min 更新运算符来实现。 $min 运算符将字段设置为更新后的值与现有值中的最小值。

以下是可以如何修改更新操作:

db.collection.updateMany(
  { '_id': { '$in': object_ids } },
  [
    {
      '$inc': { 'count': inc },
    },
    {
      '$set': {
        'count': { '$min': ['$count', 0] } // 将计数限制为不小于 0
      }
    },
    {
      '$addToSet': { ... }, 
    },
    {
      '$set': { ... }, 
    },
  ]
)

此代码的工作原理:

  1. $inc: 首先,它会按 inc 的值增加 count 字段。
  2. $min: 然后,它使用 $min 运算符将 count 字段设置为当前 count 值和 0 之间的最小值。如果 count 小于 0,则将其设置为 0。
  3. $addToSet$set: 其余的更新操作将照常执行。

通过这种方法,可以在递增计数的同时确保它永远不会低于零。

注意: 此解决方案使用聚合管道更新语法(方括号 [] 中的更新)。如果使用的是 MongoDB 的旧版本,则可能需要调整语法。

标签:mongodb,mongodb-query,atomic,increment,mongodb-update
From: 78548509

相关文章

  • MongoDb索引
    MongoDb索引数据库索引类似于图书索引。有了索引便不需要浏览整本书,而是可以采取一种快捷方式,只查看一个有内容引用的有序列表。这使得MongoDB的查找速度提高了好几个数量级。不使用索引的查询称为集合扫描,这意味着服务器端必须“浏览整本书”才能得到查询的结果。MongoDB如......
  • 深入探索 MongoDB:高级索引解析与优化策略
    MongoDB是一种非常流行的NoSQL数据库,它支持丰富的索引类型和功能,以提高数据查询的效率和性能。本文将详细介绍MongoDB的高级索引,包括基本语法、常用命令、示例、应用场景、注意事项和总结。基本语法在MongoDB中,可以使用createIndex()方法创建索引,语法如下:db.col......
  • MongoDB CRUD操作:投影Project详解
    MongoDBCRUD操作:投影Project详解文章目录MongoDBCRUD操作:投影Project详解返回文档的全部字段返回指定的字段和_id字段不输出_id字段指定排除的字段返回内嵌文档中的指定字段禁止内嵌文档中的特定字段数组中内嵌文档的投影聚合表达式的投影字段默认情况下,MongoDB查......
  • MongoDb简介
    MongoDb入门MongoDB不是关系数据库,而是面向文档(document-oriented)的数据库。MongoDB的设计采用了横向扩展。面向文档的数据模型使跨多台服务器拆分数据更加容易。MongoDB会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上文档文档是MongoDB......
  • Docker安装MongoDB
    拉取mongo镜像dockerpullmongo:4.4创建mongo数据持久化目录mkdir-p/docker_volume/mongodb/data运行容器dockerrun-itd--namemongo-v/docker_volume/mongodb/data:/data/db-p27017:27017mongo:4.4--auth.创建用户登录mongo容器,并进入到【admin】数据库dockerexec-......
  • Docker 快速搭建 MongoDB 4.x 集群(一主一从)
    目录1.生成mongo-file2.启动主节点3.启动从节点4.配置副本集5.注意事项环境:MongoDB4.0.25,AlmaLinux(建议使用Linux)部署的时候是在同一个及其上操作的,实际可以放在不同机器上。截止到2024年05月,MongoDB已经到7.x版本,后续再补一个7.x较新版本的安装......
  • 【go从入门到精通】精通并发编程-使用atomic管理状态和同步的无锁技术
    了解原子计数器        在Go中,原子计数器是多个goroutine可以同时访问的共享变量。术语“原子”是指在计数器上执行的操作的不可分割的性质。在Go中,原子计数器允许多个goroutine安全地更改共享变量,而无需使用锁或任何其他显式同步,这可确保数据完整性并避免竞......
  • mongodb查询平级数据,返回树形结构
    #mongodb查询数据,只返回一级、二级树形结构,子级数据对象整个返回db.t_ythgk_zd.aggregate([//1.匹配指定的dmlx{$match:{sjdm:"YTHGK_DIC_00002",yxx:1}},//2.查找上级代码(sjdm)对应的文档,并构建一个子文档数组{$lookup:{from:"t......
  • JUC框架(CAS、ATOMIC、AQS)
    文章目录CAS原理CAS源码示例分析CAS的特点(ABA)ABA问题循环时间长开销大只能保证一个共享变量的原子操作Jdk中`CAS`运用ATOMICAQSAQS简介AQS原理更多相关内容可查看CAS原理CAS(compareAndSwap)也叫比较交换,是一种无锁原子算法,其作用是让CPU将内存值更新为新值,但是......
  • 在Ubuntu中部署MongoDB数据库
    提示:为了方便,接下来的操作都在shell中进行(需提前建立ssh连接),当然也可以在虚拟机中进行。1.导入MongoDB的公钥首先导入MongoDB的公钥,以便后续下载和安装MongoDB输入如下代码wget-qO-https://www.mongodb.org/static/pgp/server-6.0.asc|sudoapt-keyadd-2.创建M......