点一下关注吧!!!非常感谢!!持续更新!!!
🚀 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()
方法来插入单条文档数据。该方法接收一个文档对象作为参数,将其插入到指定集合中。
javascript
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、二进制数据等
示例文档结构:
json
{
"_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文档包含元数据,如字段长度信息
实际应用场景
- 用户资料存储:
javascript
db.users.insertOne({
username: "alice123",
preferences: {
theme: "dark",
notifications: true
},
last_login: new Date()
})
- 产品目录:
javascript
db.products.insertOne({
name: "Laptop",
price: 999.99,
tags: ["electronics", "computers"],
inventory: {
warehouse1: 15,
warehouse2: 8
}
})
注意:当插入文档时,如果未指定_id
字段,MongoDB会自动生成一个唯一的ObjectId作为该文档的标识符。
shell
db.wzk.insert("hellworld!");

批量添加
在 MongoDB 中,insert 操作不仅支持单条文档插入,还可以进行批量 BSON 文档的添加。批量插入可以显著提高数据插入效率,特别是在需要插入大量数据时。以下是几种常见的批量插入方式:
- 数组批量插入
javascript
db.collection.insert([
{name: "文档1", value: 100},
{name: "文档2", value: 200},
{name: "文档3", value: 300}
])
- 使用 insertMany 方法
javascript
db.collection.insertMany([
{_id: 1, title: "文章A"},
{_id: 2, title: "文章B"},
{_id: 3, title: "文章C"}
])
- 批量插入的配置选项
javascript
db.collection.insertMany(
[...], // 文档数组
{
ordered: false, // 是否按顺序执行
writeConcern: {...} // 写入关注级别
}
)
批量插入的应用场景包括:
- 初始化数据库时导入大量初始数据
- 从其他数据源迁移数据到 MongoDB
- 执行批量数据处理任务
- 日志系统大量写入日志记录
注意事项:
- 批量插入默认是原子性的,要么全部成功,要么全部失败
- 可以通过 ordered 参数控制是否按顺序执行
- 大批量插入时建议分批进行,避免超时
- 插入前确保文档结构符合集合的模式要求
shell
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(条件)
比如我最简单的查询
shell
db.wzk.find({'0': 'h'});

逻辑查询
and条件查询详解
在MongoDB中,使用逗号分隔多个查询条件时,默认执行的是逻辑AND操作。这表示查询结果必须同时满足所有指定条件才会被返回。
基本语法
shell
db.collection.find({
key1: value1,
key2: value2
}).pretty()
实际应用示例
- 查询用户集合中年龄为25岁且职业为"程序员"的文档:
shell
db.users.find({
age: 25,
profession: "程序员"
}).pretty()
- 查询订单集合中状态为"已完成"且总金额大于1000的订单:
shell
db.orders.find({
status: "已完成",
total: {$gt: 1000}
}).pretty()
注意事项
- 当字段值为数组时,AND查询要求数组必须包含所有指定元素
- 可以组合使用不同类型的查询条件(等于、范围、正则等)
- 对于嵌套文档,可以使用点表示法进行AND查询
性能优化建议
- 为经常组合查询的字段创建复合索引
- 将选择性更高的条件放在前面
- 使用explain()分析查询执行计划
扩展说明
除了使用逗号分隔的隐式AND,也可以显式使用$and操作符:
shell
db.collection.find({
$and: [
{key1: value1},
{key2: value2}
]
})
显式and通常在需要组合or等复杂查询时使用,或者在同一个字段上需要多个条件时特别有用。
这里使用多个条件:
shell
db.wzk.find({ '0': 'h', '1': 'e'}).pretty();

or条件
shell
db.wzk.find($or:[{key1:value1, key2:value2}]).pretty()
shell
db.wzk.find({$or: [{'0': 'h'}, {'0': 'x'}]}).pretty();

not条件
$not
是MongoDB中的一个逻辑查询操作符,用于对指定条件取反。它通常与其他查询操作符配合使用,可以构建更复杂的查询条件。
基本语法
shell
db.collection.find({field: {$not: {operator: value}}}).pretty()
详细说明
$not
会对后面的查询条件取反- 可以配合各种操作符使用,如:
$eq
(等于)$gt
(大于)$lt
(小于)$regex
(正则表达式)等
示例
- 查询年龄不等于25的用户:
shell
db.users.find({age: {$not: {$eq: 25}}}).pretty()
- 查询名字不以"J"开头的用户(使用正则表达式):
shell
db.users.find({name: {$not: {$regex: "^J"}}}).pretty()
- 查询成绩不在80-100之间的学生:
shell
db.students.find({score: {$not: {$gt: 80, $lt: 100}}}).pretty()
注意事项
$not
操作符可能会导致查询性能下降,因为它需要扫描更多的文档- 在使用正则表达式时,
$not
会匹配不符合该模式的所有文档 - 对于简单的等于判断,直接使用
$ne
操作符通常效率更高
应用场景
- 需要排除特定条件的文档时
- 构建复杂的逻辑查询时
- 需要反向匹配正则表达式时
shell
db.wzk.find({'0': {$not: { $eq: 'h'}}});
