MongoDB7.0--SpringBoot单集合操作
摘要
-
本文介绍如何使用SpringBoot实现MongoDB7.0的单集合的CURD操作
-
SpringBoot版本3.2.3,MongoDB版本7.0.6
- MongoDB7.0--SpringBoot聚合操作
spring-boot 与 MongoDB 的版本对应关系
-
spring-data-mongodb
与MongoDB
版本对应关系可以参看官方文档 -
spring-boot-starter-data-mongodb
与spring-data-mongodb
版本对应关系
spring-boot-starter-data-mongodb 版本 | spring-data-mongodb 版本 | MongoDB Server 版本 | Java Driver Version |
---|---|---|---|
3.2.x | 4.2.x | 6.0.x,7.0.x | 4.11.x |
3.1.x | 4.1.x | 6.0.x,7.0.x | 4.9.x |
3.0.x | 4.0.x | 6.0.x | 4.7.x |
2.7.x | 3.4.x | 5.0.x | 4.6.x |
2.6.x | 3.3.x | 5.0.x | 4.4.x |
2.5.x | 3.2.x | 4.4.x | 4.1.x |
2.4.x | 3.1.x | 4.4.x | 4.1.x |
2.3.x | 3.0.x | 4.4.x | 4.0.x |
2.2.x | 2.2.x | 4.2.x | 3.11.x |
2.1.x | 2.1.x | 4.0.x | 3.8.x |
2.0.x | 2.0.x | 3.4.x | 3.5.x |
1.10.x | 1.10.x | 2.4.x | 2.10.x,2.11.x |
-
Mongo的Java驱动,在
3.7.x
及以后的版本叫做mongodb-driver-sync,以前的版本叫做mongo-java-driver -
MongoDB 与 Java Driver 兼容性
SpringBoot整合MongoDB
-
引入依赖
1 | <dependency> |
-
配置yml
1 | spring: |
-
配置类:去掉
_class
属性
1 |
|
查询
-
Mongo语法
1 | # 查询集合中的若干文档 |
-
query :可选,使用查询操作符指定查询条件
-
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。投影时,_id为1的时候,其他字段必须是1;_id是0的时候,其他字段可以是0;如果没有_id字段约束,多个其他字段必须同为0或同为1。
-
查询操作符
操作符 | 解释 | 示例 | 示例解释 |
---|---|---|---|
$lt |
小于 | db.collection.find({ "age": { "$lt": 25 } }) |
查询年龄小于 25 的文档 |
$lte |
小于等于 | db.collection.find({ "age": { "$lte": 25 } }) |
查询年龄小于等于 25 的文档 |
$gt |
大于 | db.collection.find({ "age": { "$gt": 25 } }) |
查询年龄大于 25 的文档 |
$gte |
大于等于 | db.collection.find({ "age": { "$gte": 25 } }) |
查询年龄大于等于 25 的文档 |
$ne |
不等于 | db.collection.find({ "age": { "$ne": 25 } }) |
查询年龄不等于 25 的文档 |
$in |
在指定数组中 | db.collection.find({ "age": { "$in": [20, 25] } }) |
查询年龄存在并且在指定数组中的文档 |
$nin |
不在指定数组中 | db.collection.find({ "age": { "$nin": [20, 25] } }) |
查询年龄不存在或者不在指定数组中的文档 |
$or |
匹配两个或多个条件中的一个 | db.collection.find({ "$or": [ { "age": 20 }, { "salary": { "$gt": 8000 } } ] }) |
查询年龄为 20 或者薪资大于 8000 的文档 |
$and |
匹配全部条件 | db.collection.find({ "$and": [ { "age": 20 }, { "salary": { "$gt": 8000 } } ] }) |
查询年龄为 20 并且薪资大于 8000 的文档 |
$all |
匹配数组中所有元素满足指定条件 | db.collection.find({ "tags": { "$all": [ { "$elemMatch": { "tagKey": "color", "tagValue": "red" } }, { "$elemMatch": { "tagKey": "size", "tagValue": "XL" } } ] } }) |
查询包含 tagKey 为 “color”,tagValue 为 “red” 的标签,并且包含 tagKey 为 “size”,tagValue 为 “XL” 的标签的文档 |
$elemMatch |
匹配数组中至少一个元素满足指定条件 | db.collection.find({ "tags": { "$elemMatch": { "tagKey": "color", "tagValue": "blue" } } }) |
查询包含 tagKey 为 “color”,tagValue 包含 “blue” 的标签的文档 |
$text |
全文搜索 | db.collection.find({ "$text": { "$search": "searchTerm" } }) |
进行全文搜索,查找包含 “searchTerm” 的文档 |
$type |
指定字段类型 | db.collection.find({ "field": { "$type": "string" } }) |
查询指定字段类型为字符串的文档 |
$size |
数组长度 | db.collection.find({ "field": { "$size": sizeValue } }) |
查询指定字段数组长度为 sizeValue 的文档 |
$exists |
字段存在 | db.collection.find({ "field": { "$exists": true } }) |
查询指定字段存在的文档 |
$mod |
取模 | db.collection.find({ "field": { "$mod": [divisor, remainder] } }) |
查询指定字段取模后符合给定除数和余数的文档 |
SpringBoot代码示例
-
操作
org.bson.Document
对象,无需创建实体映射对象,但操作时需要指定集合名称
1 | package com.hanqf; |
-
操作实体类
相关注解 | 修饰范围 | 作用 | 属性 |
---|---|---|---|
@Document | 类 | 映射类对象为Mongo文档 | value, collection |
@Id | 成员变量、方法 | 将成员变量值映射为文档的_id的值 | |
@Field | 成员变量、方法 | 将成员变量及值映射为文档中key:value对 | name, value |
@Transient | 成员变量、方法 | 指定成员变量不参与文档的序列化 |
-
使用 @Document 注解指定集合名
1 | package com.hanqf.mongo.model; |
-
查询示例
1 | package com.hanqf; |
常用的查询方法
-
查询所有文档
1 | // db.employee.find() |
-
根据_id查询
1 | // db.employee.findOne({ "_id": 1 })| |
-
查询第一个文档
1 | // db.employee.findOne({}) |
-
条件查询,排序及分页
1 | /* |
-
只返回部分字段
1 | /* |
-
去重
distinct 方法只能直接获取唯一值,并不能在查询过程中进行其他的聚合操作,使用场景非常受限,推荐使用聚合方式进行查询
1 | //语法:db.collectionName.distinct("fieldName", { /* 过滤条件 */ }),这将返回指定字段 fieldName 的唯一值数组。 |
SpringBoot对Mongo的查询,其实就是如何通过Criteria来构建一个Query,所以我们的目标就是要熟练掌握Criteria的语法。当然,如果你熟悉Mongo的查询语法,也可以直接使用BasicQuery来实现Mongo的查询。
插入
-
Mongo语法
1 | # 插入单个文档 |
writeConcern 是 MongoDB 中用来控制写入确认的选项,可选。以下是 writeConcern 参数的一些常见选项:
-
w:指定写入确认级别。如果指定为数字,则表示要等待写入操作完成的节点数。如果指定为 majority,则表示等待大多数节点完成写入操作。默认为 1,表示等待写入操作完成的节点数为 1。
-
j:表示写入操作是否要求持久化到磁盘。如果设置为 true,则表示写入操作必须持久化到磁盘后才返回成功。如果设置为 false,则表示写入操作可能在数据被持久化到磁盘之前返回成功。默认为 false。
-
wtimeout:表示等待写入操作完成的超时时间,单位为毫秒。如果超过指定的时间仍然没有返回确认信息,则返回错误。默认为 0,表示不设置超时时间。
ordered:指定是否按顺序写入,默认 true,按顺序写入。
-
插入单个文档
1 | /* |
-
插入多个文档
1 | /* |
-
id存在时更新,不存在时插入
1 | /* |
更新
-
Mongo语法
1 | # 更新单个或多个文档 |
参数 | 描述 |
---|---|
<filter> | 一个筛选器对象,用于指定要更新的文档。 |
<update> | 一个更新操作对象,用于指定如何更新文档。可以使用一些操作符,例如set、inc、$unset等,以更新文档中的特定字段。 |
upsert | 一个布尔值,用于指定如果找不到与筛选器匹配的文档时是否应插入一个新文档。如果upsert为true,则会插入一个新文档。默认值为false。 |
writeConcern | 一个文档,用于指定写入操作的安全级别。可以指定写入操作需要到达的节点数或等待写入操作的时间。 |
collation | 一个文档,用于指定用于查询的排序规则。例如,可以通过指定locale属性来指定语言环境,从而实现基于区域设置的排序。 |
arrayFilters | 一个数组,用于指定要更新的数组元素。数组元素是通过使用更新操作符[]和来指定的。 |
hint | 一个文档或字符串,用于指定查询使用的索引。该参数仅在MongoDB 4.2.1及以上版本中可用。 |
更新操作符
操作符 | 格式 | 描述 |
---|---|---|
$set | { $set: { field: value } } | 指定一个键并更新值,若键不存在则创建。 |
$unset | { $unset : { field : 1 } } | 删除一个键。 |
$inc | { $inc : { field : value } } | 对数值类型进行增减。 |
$rename | { $rename : { old_field_name : new_field_name } } | 修改字段名称。 |
$push | { $push : { field : value } } | 将数值追加到数组中,若数组不存在则会进行初始化。 |
$pushAll | { $pushAll : { field : value_array } } | 追加多个值到一个数组字段内。 |
$pull | { $pull : { field : _value } } | 从数组中删除指定的元素。 |
$addToSet | { $addToSet : { field : value } } | 添加元素到数组中,具有排重功能。 |
$pop | { $pop : { field : 1 } } | 删除数组的第一个或最后一个元素。 |
-
只更新满足条件的第一条记录
1 | /* |
-
更新所有满足条件的记录
1 | /* |
-
没有符合条件的记录则插入数据
1 | /* |
替换
-
Mongo语法
1 | db.collection.replaceOne( |
-
replaceOne
操作会首先使用指定的筛选条件来查找匹配的文档,然后用提供的新文档完全替换掉原始文档,也就是说replaceOne
是整体替换,而不是修改文档中的某些字段。
参数 | 描述 |
---|---|
<filter> | 一个筛选器对象,用于指定要替换的文档。只有与筛选器对象匹配的第一个文档才会被替换。 |
<replacement> | 一个替换文档对象,用于指定用于替换原始文档的新文档。替换文档必须包含所有要在原始文档中修改或替换的字段。 |
upsert | 一个布尔值,表示如果找不到与筛选器匹配的文档时是否应插入一个新文档。如果设置为true,则会插入一个新文档。默认为false。 |
writeConcern | 一个文档,用于指定写入操作的安全级别。可以指定写入操作需要到达的节点数或等待写入操作的时间。 |
collation | 一个文档,用于指定用于查询的排序规则。例如,可以通过指定locale属性来指定语言环境,从而实现基于区域设置的排序。 |
hint | 一个文档或字符串,用于指定查询使用的索引。该参数仅在MongoDB 4.2.1及以上版本中可用 |
-
示例
1 | /* |
删除
-
Mongo语法
1 | # 按条件删除多个文档 |
-
删除所有文档
1 | // db.employee.deleteMany({}) |
-
按条件删除文档
1 | // db.employee.deleteMany({ "salary": { "$gte": 10000 } }) |
-
删除查询到的第一个文档
1 | // db.employee.deleteOne({ "salary": { "$gte": 10000 } }) |
批量操作
-
bulkwrite()方法提供了执行批量插入、更新和删除操作的能力。
-
bulkWrite()支持以下写操作:
- insertOne
- updateOne
- updateMany
- replaceOne
- deleteOne
- deleteMany
-
示例
1 | package com.hanqf; |