文章目录
-
- [1. 测试数据构造](#1. 测试数据构造)
- [2. set](#2. set)
-
- [2.1 更新字段的值](#2.1 更新字段的值)
- [2.2 新增字段的值](#2.2 新增字段的值)
- [2.3 更新嵌入式文档字段的值](#2.3 更新嵌入式文档字段的值)
- [2.4 更新数组字段的元素值](#2.4 更新数组字段的元素值)
- [3. unset](#3. unset)
- [4. currentDate](#4. currentDate)
- [5. inc](#5. inc)
-
- [5.1 更新字段的值](#5.1 更新字段的值)
- [5.2 新增字段的值](#5.2 新增字段的值)
- [5.3 递增多个字段值](#5.3 递增多个字段值)
- [6. rename](#6. rename)
更新操作符是用于更新MongoDB文档中字段值的特殊操作符:
$currentDate
:将字段的值设置为当前日期或当前时间戳,可以使用该操作符来更新现有字段或创建新字段。
$inc
:将字段的值增加指定的数值。如果字段不存在,则创建该字段并设置初始值为指定的数值。
$min
:如果字段的值大于指定的值,则将字段的值更新为指定的值。
$max
:如果字段的值小于指定的值,则将字段的值更新为指定的值。
$mul
:将字段的值乘以指定的数值。如果字段不存在,则创建该字段并设置初始值为0。
$rename
:重命名字段。
$set
:设置字段的值。如果字段不存在,则创建该字段并设置初始值为指定的值。
$setOnInsert
:仅在插入文档时设置字段的值。如果文档已存在,则不会对字段进行更新。
$unset
:删除字段。
1. 测试数据构造
json
db.student.insertMany([
{
name: "Alice",
age: 25,
email: "[email protected]",
details: { height: 175, weight: 150 },
hobbies: ["reading", "writing", "music"],
course: [
{ subject: "math", score: 90 },
{ subject: "english", score: 80 }
]
},
{
name: "John",
age: 30,
email: "[email protected]",
details: { height: 178, weight: 180 },
hobbies: ["reading", "gaming", "traveling"],
course: [
{ subject: "math", score: 70 },
{ subject: "english", score: 80 }
]
},
{
name: "Jane",
age: 25,
email: "[email protected]",
details: { height: 160, weight: 100 },
hobbies: ["sports", "music", "cooking"],
course: [
{ subject: "math", score: 70 },
{ subject: "english", score: 60 }
]
}
])
java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "student")
public class Student {
@Id
private String Id;
private String name;
private Integer age;
private String email;
private Details details;
private List<String> hobbies;
private List<Course> course;
@Data
public static class Details {
private Integer height;
private Integer weight;
}
@Data
public static class Course {
private String subject;
private Integer score;
}
}
2. $set
$set
用于更新文档中的字段值或添加新字段,如果指定多个字段值对,$set
将更新或创建每个字段。
mysql
db.collection.update(
<query>,
{ $set: { <field1>: <value1>, ... } }
)
2.1 更新字段的值
查询 student 集合中 name=Alice 的第一个文档,将 email 字段的值更新为 [email protected] ,age 字段的值更新为 20:
mysql
db.user.updateOne(
{ name: "Alice" },
{ $set: { age: 20, email: "[email protected]" } }
)
db.student.findOne( { name: "Alice" } )
java
@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","[email protected]");
// 执行更新操作
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Student.class);
// 执行查询操作
Student student = mongoTemplate.findOne(query, Student.class);
System.out.println(student);
}
查询结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": Int32("20"),
"email": "[email protected]",
"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:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $set: { gender: "female" } }
)
db.student.findOne( { name: "Alice" } )
java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "student")
public class Student {
@Id
private 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;
@Data
public static class Details {
private Integer height;
private Integer weight;
}
@Data
public static class Course {
private String subject;
private Integer score;
}
}
java
@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);
}
查询结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": Int32("20"),
"email": "[email protected]",
"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:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $set: { "details.weight": 120} }
)
db.student.findOne( { name: "Alice" } )
java
@Test
public 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);
}
查询结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": Int32("20"),
"email": "[email protected]",
"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:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $set: { "hobbies.0": "cooking"} }
)
db.student.findOne( { name: "Alice" } )
java
@Test
public 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);
}
查询结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": Int32("20"),
"email": "[email protected]",
"details": {
"height": 175,
"weight": 120
},
"hobbies": [
"cooking",
"writing",
"music"
],
"course": [
{
"subject": "math",
"score": 90
},
{
"subject": "english",
"score": 80
}
],
"gender": "female"
}
3. $unset
$unset 操作符用于删除指定字段:
mysql
db.collection.update(
<query>,
{ $unset: { <field1>: "", <field2>: "", ... } },
{ <options> }
)
要删除age和email字段,可以使用以下命令:
mysql
db.user.insertOne({
name: "Alice",
age: 25,
email: "[email protected]"
});
mysql
db.user.update(
{"name": "Alice"},
{ $unset: { age: "", email: ""} }
)
db.user.findOne( { name: "Alice" } )
java
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "user")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
}
java
@Test
public 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 将字段的值设置为当前日期或当前时间戳,可以使用该操作符来更新现有字段或创建新字段。
mysql
db.collection.updateOne(
{ <query> },
{ $currentDate: { <field1>: true, <field2>: { $type: "date" } } }
)
$currentDate
操作符可以接受不同的值来设置字段的值:
-
true:将字段的值设置为当前日期和时间。
-
{ $type: "date" }:将字段的值设置为当前日期,忽略时间部分。
mysql
db.users.updateOne(
{ _id: 1 },
{ $currentDate: { lastModified: true, registrationDate: { $type: "date" } } }
)
users 集合中 _id 为 1 的文档的 lastModified 字段将被设置为当前日期和时间,而 registrationDate 字段将被设置为当前日期,忽略时间部分。
5. $inc
$inc 将字段的值增加指定的数值。如果字段不存在,则创建该字段并设置初始值为指定的数值。
json
db.collection.updateOne(
{ <query> },
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
)
5.1 更新字段的值
查询 student 集合中 name=Alice 的第一个文档,将 age+5:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $inc: { age: 5 } }
)
db.student.findOne( { name: "Alice" } )
java
@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);
}
查询结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": 25,
"email": "[email protected]",
"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 字段不存在将会新增该字段:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $inc: { amount : 5 } }
)
db.student.findOne( { name: "Alice" } )
java
@Data
@Document(collection = "student")
public class Student {
@Id
private 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;
@Data
public static class Details {
private Integer height;
private Integer weight;
}
@Data
public static class Course {
private String subject;
private Integer score;
}
}
java
@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);
}
查询的结果:
json
{
"_id": ObjectId("66928a18cdfcb4377f062e42"),
"name": "Alice",
"age": 30,
"email": "[email protected]",
"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:
mysql
db.student.updateOne(
{ name: "Alice" },
{ $inc: { age: 2, "details.weight": 5} }
)
java
@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);
}
查询的结果:
json
{
"_id": ObjectId("6695aa76cdfcb4377f062e6e"),
"name": "Alice",
"age": 23,
"email": "[email protected]",
"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"})
json
{
"_id": ObjectId("6695dfb6197700004d003dda"),
"email": "[email protected]",
"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