MongoDB入门详解
文章目录
- MongoDB
- 下载和安装
- 1.MongoDBCompass字段简介
- 1.1 Aggregations(聚合)
- 1.2 Schema(模式分析)
- 1.3 Indexes(索引)
- 1.4 Validation(数据验证)
- 2.增删改查操作
- 2.1创建、删除数据库,集合
- 2.2创建集合的可选参数
- 2.3条件操作符
- 2.4排序
- 2.5索引
- 3.操作案例
- 3.1 覆盖索引查询
- 3.2 查询分析explain
- 3.3 原子操作
- 3.4 高级索引:复合索引 / 文本索引 / 哈希索引
- 3.5 MapReduce 操作
- 3.6 全文检索(Text Search)
- 3.7 正则表达式查询
- 3.8 自增 ID(模拟方式)
- 参考文章
MongoDB
下载和安装
mongodb官网:https://www.mongodb.com/
下载MongoDB和MongoDBCompass。
1.MongoDBCompass字段简介
1.1 Aggregations(聚合)
- 分组(
$group
) - 过滤(
$match
) - 统计(如计数、求和、平均)
- 排序、投影、连接等操作
类似 SQL 中的 GROUP BY
+ HAVING
+ 函数处理。
1.2 Schema(模式分析)
MongoDB 是无模式(schema-less)的数据库,但 Schema 工具可以自动分析当前集合中字段的结构、类型、分布等。
- 每个字段的数据类型(string、number、array 等)
- 是否为可选字段
- 是否为空值多
- 字段的出现频率(字段使用的百分比)
1.3 Indexes(索引)
MongoDB 中的索引类似于关系型数据库中的索引,它能加速查询,避免每次都全表扫描。
常见索引类型:
- 单字段索引:对某个字段加速,如
name
- 复合索引:多个字段组合加速,如
{ name: 1, age: -1 }
- 唯一索引:字段值不能重复
- TTL 索引:自动过期删除文档(常用于缓存/临时数据)
Compass 中作用:
- 查看当前集合有哪些索引
- 创建、删除索引
- 查看哪些索引在使用(查看性能瓶颈)
1.4 Validation(数据验证)
虽然 MongoDB 是无模式的,但你可以通过 Validation 规则对插入的数据进行验证约束。
比如你可以要求:
- 字段
age
必须是数字且 >= 0 email
字段必须存在,且是字符串
Compass 中作用:
你可以可视化地配置 Validation,避免后端插入非法数据,让 MongoDB 更“像关系型数据库”。
2.增删改查操作
MongoDB 创建集合 | 菜鸟教程
2.1创建、删除数据库,集合
当你使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它。
如果数据库不存在,则创建数据库,否则切换到指定数据库。
1、创建数据库
没有这个数据库,是因为还没有数据,所以就不显示这个dbname,可以增加一条数据,就可以显示。
2、删除数据库(删除当前处于的这个数据库)
3、创建集合
4、删除集合
db.name.drop()
2.2创建集合的可选参数
MongoDB 中使用 createCollection() 方法来创建集合。
语法格式:
db.createCollection(name, options)
参数说明:
- name: 要创建的集合名称。
- options: 可选参数, 指定有关内存大小及索引的选项。
具体参数详见:MongoDB 创建集合 | 菜鸟教程
采用可视化界面创建Validation规则:
现在分别插入两个数据一个错误,一个正常观察结果。
详细错误:
可以看到是邮箱验证不正确。
2.3条件操作符
MongoDB 条件操作符 | 菜鸟教程
2.3.1、in操作符
2.3.2、逻辑操作符
2.4排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
sort()方法基本语法如下所示:
db.collection.find().sort({ field1: 1, field2: -1 })
{ field1: 1, field2: -1 }
:指定要排序的字段及排序顺序。1 表示升序,-1 表示降序。
2.5索引
MongoDB 索引 | 菜鸟教程
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
在 MongoDB 中,常见的索引类型包括:
- 单字段索引:基于单个字段的索引。
- 复合索引:基于多个字段组合的索引。
- 文本索引:用于支持全文搜索。
- 地理空间索引:用于地理空间数据的查询。
- 哈希索引:用于对字段值进行哈希处理的索引。
3.操作案例
3.1 覆盖索引查询
覆盖索引是指查询所需的字段都在一个索引中,MongoDB 无需访问文档本身,从而提升查询效率。
// 插入数据
db.users.insertMany([{ name: "Alice", age: 25, email: "alice@example.com" },{ name: "Bob", age: 30, email: "bob@example.com" }
]);
// 创建索引,仅包含 name 和 age
db.users.createIndex({ name: 1, age: 1 });
// 使用覆盖索引进行查询(不返回 _id)
db.users.find({ name: "Alice" }, { name: 1, age: 1, _id: 0 });
结果预期:
说明: 查询字段与返回字段全部包含在索引中,命中“覆盖索引”。
3.2 查询分析explain
使用 explain()
方法可查看 MongoDB 查询执行计划,帮助我们理解是否使用了索引。
db.users.find({ age: { $gt: 20 } }).explain("executionStats");
3.3 原子操作
原子性保证单个文档的操作不会中断,如 $inc
, $set
等操作。
示例:银行账户转账
// 初始账户
db.accounts.insert({ _id: 1, name: "Tom", balance: 500 });
// Tom 花了 100
db.accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } });
// 查看余额
db.accounts.find({ _id: 1 });
3.4 高级索引:复合索引 / 文本索引 / 哈希索引
// 复合索引:适用于多条件排序
db.products.createIndex({ category: 1, price: -1 });
// 文本索引:全文搜索
db.articles.insert({ title: "MongoDB", content: "MongoDB" });
db.articles.createIndex({ title: "text", content: "text" });
db.articles.find({
$text: { $
search: "indexing" } });
// 哈希索引:用于分片或随机访问
db.users.createIndex({ user_id: "hashed" });
3.5 MapReduce 操作
统计用户总订单金额:
db.orders.insertMany([{ customerId: 1, amount: 100 },{ customerId: 1, amount: 200 },{ customerId: 2, amount: 300 }
]);
db.orders.mapReduce(function () { emit(this.customerId, this.amount); },function (key, values) { return Array.sum(values); },{ out: "total_amount" }
);
// 查询结果
db.total_amount.find();
3.6 全文检索(Text Search)
db.posts.insertMany([{ title: "MongoDB tutorial", body: "Learn MongoDB full text search." },{ title: "Redis guide", body: "Redis supports fast key-value operations." }
]);
db.posts.createIndex({ title: "text", body: "text" });
db.posts.find({ $text: { $search: "MongoDB search" } });
3.7 正则表达式查询
db.customers.insertMany([{ name: "Jack" }, { name: "Jason" }, { name: "Linda" }
]);
db.customers.find({ name: /^Ja/ }); // 匹配 "Jack" 和 "Jason"
3.8 自增 ID(模拟方式)
// 初始化计数器集合
db.counters.insert({ _id: "userid", seq: 0 });
// 获取自增 ID 的函数
function getNextId(name) {return db.counters.findOneAndUpdate({ _id: name },{ $inc: { seq: 1 } },{ returnDocument: "after" }).seq;
}
// 使用自增 ID 插入数据
db.users.insert({ _id: getNextId("userid"), name: "Tom" });
参考文章
1、https://www.runoob.com/mongodb/mongodb-tutorial.html