文章目录
- 1. MongoDB 运行命令
- 2. MongoDB CRUD操作
- 1. 新增文档
- 1. 新增单个文档 insertOne
- 2. 批量新增文档 insertMany
- 2. 查询文档
- 1. 查询所有文档
- 2. 指定相等条件
- 3. 使用查询操作符指定条件
- 4. 指定逻辑操作符 (`AND` / `OR`)
- 3. 更新文档
- 1. 更新操作符语法
- 2. 更新单个文档 updateOne
- 3. 批量更新文档 updateMany
- 4. 删除文档
- 1. 删除单个文档 deleteOne
- 2. 删除符合条件的所有文档 deleteMany
- 3. 删除所有文档 deleteMany
1. MongoDB 运行命令
① 列出用户可用的数据库:
> show dbs
admin 0.000GB
config 0.000GB
knowledge 0.000GB
local 0.002GB
test 0.000GB
② 切换数据库:
> use test
switched to db test
③ 显示正在使用的数据库:
> db
test
④ 查看当前数据库下的所有集合:
> show collections
A
B
⑤ 创建集合:
> db.createCollection("t_incident")
{ "ok" : 1 }
如果集合不存在,MongoDB 会在您首次存储该集合的数据时创建该集合。
> db.myCollection.insertOne( { x: 1 } );
{"acknowledged" : true,"insertedId" : ObjectId("668bb336021f261e315be637")
}
2. MongoDB CRUD操作
SpringBoot集成MongoDB需要在项目中添加MongoDB的依赖。在pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
创建一个实体类来映射MongoDB中的文档:
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "user")
public class User {@Idprivate String id;private String name;private Integer age;private String email;public User(String name,Integer age,String email){this.name = name;this.age = age;this.email = email;}
}
1. 新增文档
1. 新增单个文档 insertOne
insertOne 命令用于新增单个文档,语法如下:
db.collection.insertOne({ key1: value1, key2: value2, ... });
其中,db.collection 是要新增文档的集合名称,key1、key2等是文档中的字段名称,而value1、value2等是对应字段的值。如果文档未指定 _id
字段,MongoDB 会将具有 ObjectId 值的 _id
字段添加到新文档中。
db.user.insertOne({ name: "Alice", age: 25, email: "alice@example.com" })
在代码中使用MongoTemplate来插入一条文档:
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void insertUser() {User user = new User();user.setName("Alice");user.setAge(25);user.setEmail("alice@example.com");// mongoTemplate.insertAll(users);mongoTemplate.insert(user);}
}
2. 批量新增文档 insertMany
insertMany 用于插入多个文档:
db.collection.insertMany([{ key1: value1, key2: value2, ... },{ key1: value3, key2: value4, ... },...
]);
其中,db.collection是你要插入文档的集合名称。key1、key2等是文档中的字段名称,而value1、value2等是对应字段的值。
db.user.insertMany([{ name: "John", age: 30, email: "11@qq.com" },{ name: "Jane", age: 25, email: "22@qq.com" },{ name: "Mike", age: 35, email: "33@qq.com" }
]);
@SpringBootTest
@RunWith(SpringRunner.class)
public class BeanLoadServiceTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void insertUser() {List<User> users = Arrays.asList(new User("John", 30, "11@qq.com"),new User("Jane", 25, "22@qq.com"),new User("Mike", 35, "33@qq.com"));mongoTemplate.insert(users,"user");// mongoTemplate.insertAll(users);}
}
2. 查询文档
查询筛选器文档指定条件,确定选择哪些记录进行读取、更新和删除操作。
可以使用 :
表达式指定相等条件和查询运算符表达式。
{<field1>: <value1>,<field2>: { <operator>: <value> },...
}
1. 查询所有文档
要查询 MongoDB 集合中的所有文档,可以使用 find() 方法。
db.collectionName.find()
其中,collectionName 是你要查询的集合的名称。执行这个命令后,MongoDB 将返回集合中的所有文档。
如果你想要以更可读的方式显示结果,可以使用 pretty() 方法:
db.collectionName.find().pretty()
查询user集合中的所有文档:
db.user.find()
@Test
public void findUser() {Query query = new Query();List<User> users = mongoTemplate.find(query, User.class);// List<User> users = mongoTemplate.findAll(User.class,"user");users.forEach(System.out::println);
}
2. 指定相等条件
要选择匹配相等条件的文档,请在<field>:<value>
中将条件指定为查询过滤器文档。
查询user集合中为"John"的所有文档:
db.user.find( { name: "John" } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").is("John");// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class);users.forEach(System.out::println);
}
此操作对应于以下 SQL 语句:
SELECT * FROM user WHERE name = "John"
查询user集合中匹配查询条件name为"John"的第一个文档:
db.user.findOne( { "name": "John" } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").is("John");// 创建查询对象Query query = new Query(criteria);// 执行查询User user = mongoTemplate.findOne(query, User.class);System.out.println(user);
}
3. 使用查询操作符指定条件
在查询过滤器文档中使用查询操作符来执行更复杂的比较和评估。
查询user集合中name为 "John"或者 “Alice” 的所有文档:
db.user.find( { name: { $in: [ "John", "Alice" ] } } )
注意,尽管您可以使用 $or
操作符来表示此查询,但在对同一字段执行相等检查时,请使用 $in
操作符而不是 $or
操作符。
此操作对应于以下 SQL 语句:
SELECT * FROM user WHERE name in ("John", "Alice" )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").in("John", "Alice");// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class, "user");users.forEach(System.out::println);
}
查询user集合中匹配查询条件name为 "John"或者 “Alice” 的第一个文档
db.user.findOne( { name: { $in: [ "John", "Alice" ] } } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = Criteria.where("name").in("John", "Alice");// 创建查询对象Query query = new Query(criteria);// 执行查询User user = mongoTemplate.findOne(query, User.class);
}
4. 指定逻辑操作符 (AND
/ OR
)
复合查询可以为集合文档中的多个字段指定条件。
① 逻辑 AND
连接词隐式地连接复合查询的子句,以便该查询选择集合中与所有条件匹配的文档。
查询user集合中name为Alice且age>20的文档:
db.user.find( { name: "Alice", "age": { $gte: 20 } } )
@Test
public void findUser() {// 创建查询条件Criteria criteria = new Criteria();criteria.and("name").is("Alice");criteria.and("age").gte(20);// 创建查询对象Query query = new Query(criteria);// 执行查询List<User> users = mongoTemplate.find(query, User.class, "user");
}
② 使用 $or
操作符指定复合查询,该复合查询使用逻辑 OR
结合使用每个子句,以便查询选择集合中至少匹配一个条件的文档。
查询user集合中email为 "11@qq.com"且age>20或者name为"John"的文档:
db.user.find( {email: "11@qq.com",$or: [ { "age": { $gte: 20 } }, { name: "John" } ]
} )
@Test
public void findUser() {Query query = new Query();query.addCriteria(Criteria.where("email").is("11@qq.com").orOperator(Criteria.where("age").gte(20), Criteria.where("name").is("John")));List<User> users = mongoTemplate.find(query, User.class);users.forEach(System.out::println);
}
3. 更新文档
1. 更新操作符语法
要更新文档,MongoDB 提供了更新操作符(例如$set
)来修改字段值。要使用更新操作符,请向更新方法传递以下形式的更新文档:
{<update operator>: { <field1>: <value1>, ... },<update operator>: { <field2>: <value2>, ... },...
}
某些更新操作符(例如 $set
)会在字段不存在的情况下创建字段。
2. 更新单个文档 updateOne
① 更新字段的值:更新user集合中与指定筛选器匹配的第一个文档,将name为"John"的age更新为22
db.user.updateOne( { name: "John" },{$set: {age: 22}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().set("age", 22);mongoTemplate.updateFirst(query, update, User.class);
}
② 新增字段:
db.user.updateOne( { name: "John" },{$set: {city: "ShangHai"}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().set("city", "ShangHai");mongoTemplate.updateFirst(query, update, User.class);
}
③ 删除字段:
db.user.updateOne( { name: "John" },{$unset: {city: ""}}
)
@Test
public void updateUser(){// 查询对象Query query = new Query(Criteria.where("name").is("John"));// 更新对象Update update = new Update().unset("city");mongoTemplate.updateFirst(query, update, User.class);
}
3. 批量更新文档 updateMany
updateMany 更新与指定过滤器匹配的所有文档。
更新user集合中 age小于等于25的所有文档,将email设置为"hh@qq.com",将age设置为28。
db.user.updateMany({ age: { $lt: 25 } },{$set: { email: "hh.qq.com",age:28 }}
)
@Test
public void updateUser(){// 构建查询条件Criteria criteria = Criteria.where("age").gte(25);Query query = Query.query(criteria);// 构建更新操作Update update = new Update();update.set("email", "hh.qq.com");update.set("age", 28);// 执行更新操作mongoTemplate.updateMulti(query, update, "user");
}
4. 删除文档
1. 删除单个文档 deleteOne
deleteOne 用于删除与指定过滤器匹配的单个文档。删除user集合中匹配name为"Alice"的第一个文档:
db.user.deleteOne( { name: "Alice" } )
@Test
public void deleteUser(){Query query = new Query();query.addCriteria(Criteria.where("name").is("Alice"));mongoTemplate.remove(query,User.class);
}
2. 删除符合条件的所有文档 deleteMany
您可以指定条件或过滤器来标识要删除的文档。过滤器使用与读取操作相同的语法。删除user集合age=28的所有文档:
db.user.deleteMany( { age:28 } )
3. 删除所有文档 deleteMany
要删除集合中的所有文档,将空的过滤器文档 {}
传递到 db.collection.deleteMany()
方法。
db.user.deleteMany({})