MongoDB - 字段更新操作符:$set、$unset、$inc、$currentDate、$rename

文章目录

    • 1. 测试数据构造
    • 2. $set
      • 2.1 更新字段的值
      • 2.2 新增字段的值
      • 2.3 更新嵌入式文档字段的值
      • 2.4 更新数组字段的元素值
    • 3. $unset
    • 4. $currentDate
    • 5. $inc
      • 5.1 更新字段的值
      • 5.2 新增字段的值
      • 5.3 递增多个字段值
    • 6. $rename

更新操作符是用于更新MongoDB文档中字段值的特殊操作符:

$currentDate:将字段的值设置为当前日期或当前时间戳,可以使用该操作符来更新现有字段或创建新字段。
$inc:将字段的值增加指定的数值。如果字段不存在,则创建该字段并设置初始值为指定的数值。
$min:如果字段的值大于指定的值,则将字段的值更新为指定的值。
$max:如果字段的值小于指定的值,则将字段的值更新为指定的值。
$mul:将字段的值乘以指定的数值。如果字段不存在,则创建该字段并设置初始值为0。
$rename:重命名字段。
$set:设置字段的值。如果字段不存在,则创建该字段并设置初始值为指定的值。
$setOnInsert:仅在插入文档时设置字段的值。如果文档已存在,则不会对字段进行更新。
$unset:删除字段。

1. 测试数据构造

db.student.insertMany([{name: "Alice",age: 25,email: "Alice@example.com",details: { height: 175, weight: 150 },hobbies: ["reading", "writing", "music"],course: [{ subject: "math", score: 90 },{ subject: "english", score: 80 }]},{name: "John",age: 30,email: "John@qq.com",details: { height: 178, weight: 180 },hobbies: ["reading", "gaming", "traveling"],course: [{ subject: "math", score: 70 },{ subject: "english", score: 80 }]},{name: "Jane",age: 25,email: "Jane@qq.com",details: { height: 160, weight: 100 },hobbies: ["sports", "music", "cooking"],course: [{ subject: "math", score: 70 },{ subject: "english", score: 60 }]}
])
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "student")
public class Student {@Idprivate String Id;private String name;private Integer age;private String email;private Details details;private List<String> hobbies;private List<Course> course;@Datapublic static class Details {private Integer height;private Integer weight;}@Datapublic static class Course {private String subject;private Integer score;}
}

2. $set

$set 用于更新文档中的字段值或添加新字段,如果指定多个字段值对,$set 将更新或创建每个字段。

db.collection.update(<query>,{ $set: { <field1>: <value1>, ... } }
)

2.1 更新字段的值

查询 student 集合中 name=Alice 的第一个文档,将 email 字段的值更新为 Alice@163.com ,age 字段的值更新为 20:

db.user.updateOne({ name: "Alice" },{ $set: { age: 20, email: "Alice@163.com" } }
)db.student.findOne( { name: "Alice" } )
@Test
public void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.set("age",20);update.set("email","Alice@163.com");// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": Int32("20"),"email": "Alice@163.com","details": {"height": 175,"weight": 150},"hobbies": ["reading","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}]
}

2.2 新增字段的值

查询 student 集合中 name=Alice 的第一个文档,新增字段 gender 并将值置为 female:

db.student.updateOne({ name: "Alice" },{ $set: { gender: "female" } }
)db.student.findOne( { name: "Alice" } )
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "student")
public class Student {@Idprivate String Id;private String name;private Integer age;private String email;private Details details;private List<String> hobbies;private List<Course> course;private String gender;@Datapublic static class Details {private Integer height;private Integer weight;}@Datapublic static class Course {private String subject;private Integer score;}
}
@Test
public void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.set("gender","female");// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": Int32("20"),"email": "Alice@163.com","details": {"height": 175,"weight": 150},"hobbies": ["reading","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female"
}

2.3 更新嵌入式文档字段的值

查询 student 集合中 name=Alice 的第一个文档,将嵌入式 details 文档中的 weight 字段设置为120:

db.student.updateOne({ name: "Alice" },{ $set: { "details.weight": 120} }
)db.student.findOne( { name: "Alice" } )
 @Testpublic void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.set("details.weight",120);// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": Int32("20"),"email": "Alice@163.com","details": {"height": 175,"weight": 120},"hobbies": ["reading","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female"
}

2.4 更新数组字段的元素值

查询 student 集合中 name=Alice 的第一个文档,将hobbies数组中的第一个元素更新为cooking:

db.student.updateOne({ name: "Alice" },{ $set: { "hobbies.0": "cooking"} }
)db.student.findOne( { name: "Alice" } )
 @Testpublic void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.set("hobbies.0","cooking");// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": Int32("20"),"email": "Alice@163.com","details": {"height": 175,"weight": 120},"hobbies": ["cooking","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female"
}

3. $unset

$unset 操作符用于删除指定字段:

db.collection.update(<query>,{ $unset: { <field1>: "", <field2>: "", ... } },{ <options> }
)

要删除age和email字段,可以使用以下命令:

db.user.insertOne({ name: "Alice", age: 25, email: "alice@example.com" 
});
db.user.update({"name": "Alice"},{ $unset: { age: "", email: ""} }
)db.user.findOne( { name: "Alice" } )
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "user")
public class User {@Idprivate String id;private String name;private Integer age;private String email;
}
 @Testpublic void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.unset("age");update.unset("email");// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, User.class);// 执行查询操作User user = mongoTemplate.findOne(query, User.class);System.out.println(user);
}

4. $currentDate

$currentDate 将字段的值设置为当前日期或当前时间戳,可以使用该操作符来更新现有字段或创建新字段。

db.collection.updateOne({ <query> },{ $currentDate: { <field1>: true, <field2>: { $type: "date" } } }
)

$currentDate 操作符可以接受不同的值来设置字段的值:

  • true:将字段的值设置为当前日期和时间。

  • { $type: “date” }:将字段的值设置为当前日期,忽略时间部分。

db.users.updateOne({ _id: 1 },{ $currentDate: { lastModified: true, registrationDate: { $type: "date" } } }
)

users 集合中 _id 为 1 的文档的 lastModified 字段将被设置为当前日期和时间,而 registrationDate 字段将被设置为当前日期,忽略时间部分。

5. $inc

$inc 将字段的值增加指定的数值。如果字段不存在,则创建该字段并设置初始值为指定的数值。

db.collection.updateOne({ <query> },{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
)

5.1 更新字段的值

查询 student 集合中 name=Alice 的第一个文档,将 age+5:

db.student.updateOne({ name: "Alice" },{ $inc: { age: 5 } }
)db.student.findOne( { name: "Alice" } )
@Test
public void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.inc("age",5);// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": 25,"email": "Alice@163.com","details": {"height": 175,"weight": 120},"hobbies": ["cooking","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female"
}

5.2 新增字段的值

查询 student 集合中 name=Alice 的第一个文档,如果 amount 字段不存在将会新增该字段:

db.student.updateOne({ name: "Alice" },{ $inc: { amount : 5 } }
)db.student.findOne( { name: "Alice" } )
@Data
@Document(collection = "student")
public class Student {@Idprivate String Id;private String name;private Integer age;private String email;private Details details;private List<String> hobbies;private List<Course> course;private String gender;// 新增的字段private Integer amount;@Datapublic static class Details {private Integer height;private Integer weight;}@Datapublic static class Course {private String subject;private Integer score;}
}
@Test
public void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.inc("amount",5);// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询的结果:

{"_id": ObjectId("66928a18cdfcb4377f062e42"),"name": "Alice","age": 30,"email": "Alice@example.com","details": {"height": 175,"weight": 120},"hobbies": ["cooking","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female","amount": 5
}

5.3 递增多个字段值

查询 student 集合中 name=Alice 的第一个文档,将age+5,嵌入式文档details的weight+5:

db.student.updateOne({ name: "Alice" },{ $inc: { age: 2, "details.weight": 5} }
)
@Test
public void updateUser(){// 创建查询条件Criteria criteria = Criteria.where("name").is("Alice");// 创建查询对象Query query = new Query(criteria);// 创建更新对象Update update = new Update();update.inc("age",-2);update.inc("details.weight",-5);// 执行更新操作UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);// 执行查询操作Student student = mongoTemplate.findOne(query, Student.class);System.out.println(student);
}

查询的结果:

{"_id": ObjectId("6695aa76cdfcb4377f062e6e"),"name": "Alice","age": 23,"email": "Alice@163.com","details": {"height": 175,"weight": 115},"hobbies": ["cooking","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"gender": "female","amount": 5
}

6. $rename

$rename更新字段的名称:

db.collection.update({ <query> },{ $rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }
)

查询 student 集合中 name=Alice 的第一个文档,将name更名为newName,age更名为newAge:

db.student.updateOne({ name: "Alice" },{ $rename: {age: "newAge",name: "newName"} }
)

在这里插入图片描述

查询 student 集合中 newName=Alice 的第一个文档:

db.student.findOne({newName:"Alice"})
{"_id": ObjectId("6695dfb6197700004d003dda"),"email": "Alice@example.com","details": {"height": 175,"weight": 150},"hobbies": ["reading","writing","music"],"course": [{"subject": "math","score": 90},{"subject": "english","score": 80}],"newAge": 25,"newName": "Alice"
}

查询 student 集合中name=Alice 的第一个文档:null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3249849.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch 深度学习实践-处理多维特征的输入

视频指路 参考博客笔记 参考笔记二 通过多个线性模型来模拟非线性的空间变换&#xff0c;矩阵计算就是不同维度之间的空间转换 说明&#xff1a;1、乘的权重(w)都一样&#xff0c;加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的&#xff0c…

适用于 Android 的恢复应用程序合集分享

丢失重要文件或数据从来都不是一件有趣的事。这种情况可能发生在您的计算机和笔记本电脑上&#xff0c;也可能发生在您的 Android 智能手机或平板电脑上。然而&#xff0c;尽管 Android 用户可能认为在这种情况下他们可用的选择较少&#xff0c;但用于 Android 数据恢复的应用程…

Linux下vim编辑器的使用方法

Vim编辑器 vim kk 使用vim来创建或编辑 kk文件 一般模式下的操作 x 为向后删除一个字符 nx 连续向后删除n个字符 dd 删除光标所在行 ndd 删除光标所在的向下n行 yy 复制光标所在的那一行 nyy 复制光标所在的向下n列 p 将已复制的数据在光标下一行粘贴上 P 则为贴在光标的上一…

0718vscode问答

终于来到 qt # Question 多态 # Answer 多态是面向对象编程中的一个重要概念&#xff0c;指的是同一个接口可以有多种不同的实现方式。多态性允许我们使用一个统一的接口来处理不同类型的对象&#xff0c;从而提高代码的灵活性和可扩展性。 在Java中&#xff0c;多态可以通过以…

JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现PSO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-Transformer-LSTM多变量回归预测&#xff0c;粒子群优化Transformer结合LST…

CTF-Web习题:[HFCTF2021]Unsetme

题目链接&#xff1a;[HFCTF2021]Unsetme 解题思路 打开靶场发现是一段PHP源码 做一下代码审阅&#xff1a; <?php// Kickstart the framework $f3require(lib/base.php);//引入f3框架源码$f3->set(DEBUG,1);//f3对象设置DEBUG属性 if ((float)PCRE_VERSION<8.0)…

C++【OpenCV】图片亮度色度归一化

#include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;int main() {Mat image imread("SrcMF.jpg");// 灰度、Gamma归一化亮度cv::Mat m_gray;cv::cvtColor(image, m_gra…

channle介绍

通道在Java NIO&#xff08;New Input/Output&#xff09;中扮演着核心角色&#xff0c;它们是与Buffer&#xff08;缓冲区&#xff09;交互的入口点&#xff0c;用于从外部资源读取数据到内存或从内存写入数据到外部资源。通道可以看作是访问文件数据和其他I/O资源&#xff08…

力扣第十七题——电话号码的字母组合

内容介绍 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出…

【JS逆向课件:第六课:文件操作】

文件操作 引言 到目前为止&#xff0c;我们做的一切操作&#xff0c;都是在内存里进行的&#xff0c;这样会有什么问题吗&#xff1f;如果一旦断电或发生意外关机了&#xff0c;那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢&#xff1f;现在你是否感觉你的编程技…

【JS逆向课件:第四课:流程控制】

流程控制 条件判断 顺序结构的程序虽然能解决计算、输出等问题&#xff0c;但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。 单分支语句 语法&#xff1a; if 表达式:代码块说明&#xff1a; 1、“表达式”可以是一个单一的值或者复杂语句&#xff0c;形…

[Maven] 打包编译本地Jar包报错的几种解决办法

目录 方式1&#xff1a;通过scope指定 方式2&#xff1a;通过新建lib 方式3&#xff1a;通过build节点打包依赖​​​​​​​ 方式4&#xff1a;安装Jar包到本地 方式5&#xff1a;发布到远程私有仓库 方式6&#xff1a;删除_remote.repositories 方式7&#xff1a;打包…

TCP三次握手与四次挥手详解

1.什么是TCP TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;属于互联网协议族&#xff08;TCP/IP&#xff09;的一部分。TCP 提供可靠的、顺序的、无差错的数据传输服务&…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前&#xff0c;请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看&#xff1a;**单独设置过滚动条样式代码实例&#xff1a; ::-webkit-scrollbar {/*滚动条整体样式*/wi…

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1&#xff0c;介绍举例 2&#xff0c;原理和实现实现 3&#xff0c;注意点 1&#xff0c;介绍 一般情况下&#xff0c;action 是一个平面对象&#xff0c;并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

git教程, 命令行版

前言 git就是代码版本管理系统&#xff0c;很简单的作用就是每一次commit之后&#xff0c;修改文件都是跟上一次commit的仓库文件做对比&#xff0c;也可以调出历史的文件查看某次commit修改了什么东西 0环境准备&#xff1a; 安装git, 百度一下&#xff0c;然后打开cmd&…

[word] word表格跨页断开实现教程 #职场发展#媒体

word表格跨页断开实现教程 选中整个word表格 单击鼠标右键&#xff0c;选择“表格属性”选项 切换至“行”标签&#xff0c;找到“允许跨页断行”选项 勾选上“允许跨页断行”&#xff0c;单击“确定”按钮&#xff0c;完成&#xff01; word表格跨页断开实现教程的下载地址&a…

【机器学习】--下采样原理及代码详解

下采样&#xff08;Downsampling&#xff09;是信号处理、图像处理和机器学习中的一个关键概念&#xff0c;主要通过减少数据点的数量来降低信号或图像的采样率 一、定义与原理 定义&#xff1a;下采样是指通过减少数据点的数量来降低信号或图像的采样率。在图像处理中&#…

【05】LLaMA-Factory微调大模型——初尝微调模型

上文【04】LLaMA-Factory微调大模型——数据准备介绍了如何准备指令监督微调数据&#xff0c;为后续的微调模型提供高质量、格式规范的数据支撑。本文将正式进入模型微调阶段&#xff0c;构建法律垂直应用大模型。 一、硬件依赖 LLaMA-Factory框架对硬件和软件的依赖可见以下…