Java-146 深入浅出 MongoDB 数据插入、批量写入、BSON 格式与逻辑查询and or not操作指南
点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的模型 + 深度思考模型 + 实时路由”,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年10月07日更新到:
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
数据操作
数据添加
单条数据插入操作
MongoDB提供了insertOne()
方法来插入单条文档数据。该方法接收一个文档对象作为参数,将其插入到指定集合中。
db.collection.insertOne({ name: "John Doe",age: 30,email: "john@example.com",address: {city: "New York",zip: "10001"},hobbies: ["reading", "hiking"]}
)
文档数据结构
MongoDB文档采用类似JSON的结构,但使用更丰富的BSON格式。文档由字段和值对组成,支持以下数据类型:
- 基本类型:字符串、数值、布尔值
- 复杂类型:数组、嵌套文档
- 特殊类型:日期、ObjectId、二进制数据等
示例文档结构:
{"_id": ObjectId("507f191e810c19729de860ea"),"username": "johndoe","created_at": ISODate("2023-01-15T10:30:00Z"),"scores": [85, 92, 78],"profile": {"firstName": "John","lastName": "Doe"}
}
BSON格式详解
BSON(Binary JSON)是MongoDB使用的二进制编码格式,具有以下特点:
- 效率更高:二进制格式比文本格式解析更快
- 数据类型更丰富:支持日期、二进制数据等额外类型
- 可遍历性:BSON文档包含长度前缀,便于快速扫描
BSON与JSON的主要区别:
- BSON支持二进制数据,JSON不支持
- BSON有特定的日期类型,JSON用字符串表示日期
- BSON文档包含元数据,如字段长度信息
实际应用场景
- 用户资料存储:
db.users.insertOne({username: "alice123",preferences: {theme: "dark",notifications: true},last_login: new Date()
})
- 产品目录:
db.products.insertOne({name: "Laptop",price: 999.99,tags: ["electronics", "computers"],inventory: {warehouse1: 15,warehouse2: 8}
})
注意:当插入文档时,如果未指定_id
字段,MongoDB会自动生成一个唯一的ObjectId作为该文档的标识符。
db.wzk.insert("hellworld!");
批量添加
在 MongoDB 中,insert 操作不仅支持单条文档插入,还可以进行批量 BSON 文档的添加。批量插入可以显著提高数据插入效率,特别是在需要插入大量数据时。以下是几种常见的批量插入方式:
- 数组批量插入
db.collection.insert([{name: "文档1", value: 100},{name: "文档2", value: 200},{name: "文档3", value: 300}
])
- 使用 insertMany 方法
db.collection.insertMany([{_id: 1, title: "文章A"},{_id: 2, title: "文章B"},{_id: 3, title: "文章C"}
])
- 批量插入的配置选项
db.collection.insertMany([...], // 文档数组{ordered: false, // 是否按顺序执行writeConcern: {...} // 写入关注级别}
)
批量插入的应用场景包括:
- 初始化数据库时导入大量初始数据
- 从其他数据源迁移数据到 MongoDB
- 执行批量数据处理任务
- 日志系统大量写入日志记录
注意事项:
- 批量插入默认是原子性的,要么全部成功,要么全部失败
- 可以通过 ordered 参数控制是否按顺序执行
- 大批量插入时建议分批进行,避免超时
- 插入前确保文档结构符合集合的模式要求
db.wzk.insert(["hello!", "world!"])
数据查询
MongoDB提供了丰富的查询操作符来实现各种条件查询,主要包括以下几类:
比较操作符
-
等于($eq)
- 查询指定字段等于某个值的文档
- 示例:
db.collection.find({age: {$eq: 25}})
-
不等于($ne)
- 查询指定字段不等于某个值的文档
- 示例:
db.collection.find({age: {$ne: 25}})
-
大于($gt)
- 查询指定字段大于某个值的文档
- 示例:
db.collection.find({age: {$gt: 25}})
-
大于等于($gte)
- 查询指定字段大于或等于某个值的文档
- 示例:
db.collection.find({age: {$gte: 25}})
-
小于($lt)
- 查询指定字段小于某个值的文档
- 示例:
db.collection.find({age: {$lt: 25}})
-
小于等于($lte)
- 查询指定字段小于或等于某个值的文档
- 示例:
db.collection.find({age: {$lte: 25}})
组合查询
可以使用逻辑操作符组合多个条件:
- $and:同时满足多个条件
- 示例:
db.collection.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]})
- 示例:
- $or:满足任意一个条件
- 示例:
db.collection.find({$or: [{age: {$lt: 20}}, {age: {$gt: 30}}]})
- 示例:
使用场景
- 范围查询:查找年龄在20-30岁之间的用户
db.users.find({age: {$gte: 20, $lte: 30}})
- 排除特定值:查找所有不是VIP的用户
db.users.find({vip: {$ne: true}})
- 组合条件:查找年龄大于25岁或者收入低于5000的用户
db.users.find({$or: [{age: {$gt: 25}}, {income: {$lt: 5000}}]})
这些查询操作可以结合索引使用以提高查询效率,特别是在处理大量数据时,合理的查询条件和索引设计能显著提升查询性能。
db.wzk.find(条件)
比如我最简单的查询
db.wzk.find({'0': 'h'});
逻辑查询
and条件查询详解
在MongoDB中,使用逗号分隔多个查询条件时,默认执行的是逻辑AND操作。这表示查询结果必须同时满足所有指定条件才会被返回。
基本语法
db.collection.find({key1: value1,key2: value2
}).pretty()
实际应用示例
- 查询用户集合中年龄为25岁且职业为"程序员"的文档:
db.users.find({age: 25,profession: "程序员"
}).pretty()
- 查询订单集合中状态为"已完成"且总金额大于1000的订单:
db.orders.find({status: "已完成",total: {$gt: 1000}
}).pretty()
注意事项
- 当字段值为数组时,AND查询要求数组必须包含所有指定元素
- 可以组合使用不同类型的查询条件(等于、范围、正则等)
- 对于嵌套文档,可以使用点表示法进行AND查询
性能优化建议
- 为经常组合查询的字段创建复合索引
- 将选择性更高的条件放在前面
- 使用explain()分析查询执行计划
扩展说明
除了使用逗号分隔的隐式AND,也可以显式使用$and操作符:
db.collection.find({$and: [{key1: value1},{key2: value2}]
})
显式and通常在需要组合or等复杂查询时使用,或者在同一个字段上需要多个条件时特别有用。
这里使用多个条件:
db.wzk.find({ '0': 'h', '1': 'e'}).pretty();
or条件
db.wzk.find($or:[{key1:value1, key2:value2}]).pretty()
db.wzk.find({$or: [{'0': 'h'}, {'0': 'x'}]}).pretty();
not条件
$not
是MongoDB中的一个逻辑查询操作符,用于对指定条件取反。它通常与其他查询操作符配合使用,可以构建更复杂的查询条件。
基本语法
db.collection.find({field: {$not: {operator: value}}}).pretty()
详细说明
$not
会对后面的查询条件取反- 可以配合各种操作符使用,如:
$eq
(等于)$gt
(大于)$lt
(小于)$regex
(正则表达式)等
示例
- 查询年龄不等于25的用户:
db.users.find({age: {$not: {$eq: 25}}}).pretty()
- 查询名字不以"J"开头的用户(使用正则表达式):
db.users.find({name: {$not: {$regex: "^J"}}}).pretty()
- 查询成绩不在80-100之间的学生:
db.students.find({score: {$not: {$gt: 80, $lt: 100}}}).pretty()
注意事项
$not
操作符可能会导致查询性能下降,因为它需要扫描更多的文档- 在使用正则表达式时,
$not
会匹配不符合该模式的所有文档 - 对于简单的等于判断,直接使用
$ne
操作符通常效率更高
应用场景
- 需要排除特定条件的文档时
- 构建复杂的逻辑查询时
- 需要反向匹配正则表达式时
db.wzk.find({'0': {$not: { $eq: 'h'}}});