Mongodb中一个小巧的数据更新命令$inc

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第55篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。

inc是一个很小巧的命令。说它小巧,一个是因为短,只有三个字符。另一个是说它功能轻巧。在开发库存,电商类的应用时,往往遇到订单增加,库存减少的数据更新场景。使用inc命令,可以将订单增加,库存减少在同一个原子操作中完成。使得这样复杂的数据性一致操作,变得很轻巧。同时,官方文档给出的篇幅也很小。忙碌了一天,阅读文档时也顿觉轻巧。

定义

使用操作符$inc,按照用户指定的大小,增加或减少字段值

语法

使用$inc操作符需要遵照下面的语法。其中,amount正值表示向字段增加,复制表示减少。

复制代码
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ...}}

行为

从mongodb5.0开始,更新操作的顺序按照文档字段名的字母表顺序执行。带有数字名称的字段,按照数字顺序更新。

如下面的更新语句中, 字段"a.2"在"a.10"前更新。因为数字2排列在数字10前。

复制代码
{$set: { "a.2": <new value>, "a.10": <new value>}}

操作符$inc接受正值和负值。

当字段不存在是,操作符$inc添加字段并将字段设置为指定的数值。

使用$inc操作空值null时,Mongodb会报错。

单文档操作中使用$inc操作符修改数据的行为是一个原子操作。

mongodb 5.0版本以后,向$inc传入空表达式({ })时,mongodb不再抛出错误。空表达式不会修改字段值 ,也不会在oplog中,添加新的操作记录。

应用举例

创建一个products集合,并插入数据。

复制代码
db.products.insertOne(
    {
        _id: 1,
        sku: "abc123",
        quantity: 10,
        metrics: { orders: 2, ratings: 3.5}
    }
)

构建数据修改脚本,满足下面的数据更新要求

  • 将字段"metrics.orders"值增加1

  • 将字段值quantity减2

    db.products.updateOne(
    {sku: "abc123"},
    {$inc: {quantity: -2, "metrics.orders": 1}}
    )

查看更新结果

复制代码
db.products.find()
{
	"_id" : 1,
	"sku" : "abc123",
	"quantity" : 8,
	"metrics" : {
		"orders" : 3,
		"ratings" : 3.5
	}
}
相关推荐
2301_815279521 小时前
SQL如何利用聚合函数生成业务分析指标_KPI计算基础教程
jvm·数据库·python
qq_330037991 小时前
mysql如何排查Out of memory错误_mysql内存分配调优
jvm·数据库·python
哈__2 小时前
Linux生产环境MongoDB部署与安全加固:用户权限、防火墙、远程访问完整方案
linux·安全·mongodb
weixin_458580122 小时前
如何在 Go 中直接将 AST 编译为可执行二进制文件?
jvm·数据库·python
Highcharts.js4 小时前
Highcharts Grid 中文站正式上线:表格数据处理的全新选择
前端·javascript·数据库·表格数据·highcharts·可视化图表·企业级图表
Elastic 中国社区官方博客7 小时前
Elasticsearch:使用 Agent Builder 的 A2A 实现 - 开发者的圣诞颂歌
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
2301_816660217 小时前
PHP怎么处理Eloquent Attribute Inference属性推断_Laravel从数据自动推导类型【操作】
jvm·数据库·python
qq_372154238 小时前
Go 中自定义类型与基础类型的显式转换规则详解
jvm·数据库·python
_下雨天.9 小时前
NoSQL之Redis配置与优化
数据库·redis·nosql
LiAo_1996_Y9 小时前
CSS如何实现文字渐变效果_通过background-clip实现艺术字
jvm·数据库·python