持续更新
记录 mongodb 相关的常识,以及使用过程中遇到的问题。
1. 常识
资料
MongoDB manual: https://www.mongodb.com/zh-cn/docs/manual/
1.1 mongodb 支持外键吗?
mongodb 没有类似于关系数据库的外键机制。
只能是通过引用或嵌套文档,建立起文档间的关系,然后在应用层去做完整性的判断。
1.2 ObjectID 的构成
是一个 12 字节的 bson 类型,构成如下:
4 字节时间戳,单位是秒;
3 字节机器标识;
2 字节进程 id;
3 字节计数器;
用 16 进制表示就是一个 24 个字符的字符串。ObjectID 几乎是唯一的,但不能保证百分百唯一,计数器可能会溢出。
在 python 中,可以这样生成一个 ObjectID:
from bson.objectid import ObjectId
ObjectId()
1.3 默认情况下,MongoDB 为每个集合创建什么索引?
默认创建一个名为 _id
的索引,它是一个 ObjectID。
1.4 MongoDB 的管理与命令
1.4.1 数据库管理
有3个默认的数据库: admin, local, config。
1、查看所有数据库
show dbs;
或 show databases;
2、查看当前数据库
db;
3、切换数据库
use <dbname>;
4、删除当前数据库
db.dropDatabase();
1.4.2 集合管理
1、查看所有集合
show collections;
2、创建集合
db.createCollection("<collection>");
3、删除集合
db.<collection>.drop();
1.4.3 索引管理
官方文档:https://www.mongodb.com/zh-cn/docs/manual/indexes/
1、创建索引
db.<collection>.createIndex(<keys>, <options>)
比如:
创建复合索引 db.abc.createIndex({userid: 1, grade: -1})
,userid 是升序,grade 是降序。
创建单字段索引 db.abc.createIndex({score:1})
, 创建了 score 字段的索引,升序。
创建 text 索引 db.abc.createIndex({address:"text"})
。
2、查询索引
db.<collection>.getIndexes();
3、删除索引
db.<collection>.dropIndex(<keys>)
比如: db.abc.dropIndex({userid: 1,})
4、删除所有索引
db.<collection>.dropIndexes()
1.4.4 CRUD
官方文档: https://www.mongodb.com/zh-cn/docs/manual/crud/
1、插入
db.<collection>.insertOne(<document>)
db.<collection>.insertMany([<document>, ..., <document>])
<document>
是 kv 结构的 table: {k1:v1, k2:v2, ...}
2、查询
db.<collection>.find({key:value or conditions})
3、更新
db.<collection>.update({key:value}, {$set, {newkey:newvalue}})
4、删除
db.<collection>.deleteOne({key:value or conditons})
db.<collection>.deleteMany({key:value or conditons})
比如 db.abc.deleteOne({num:{$lt:50}})
, 删除 abc 集合中,num 字段小于 50 的一个文档。
1.5 MongoDB 的索引
参考自: 《MongoDB 概念及基础CRUD》 [1]
索引名称 | 简介 |
---|---|
Single Field | 单字段的 升序/降序 索引 |
Compound Index | 复合索引 |
Multikey Index | 数组值索引,可以给一个字段值为数组的字段中的一个或多个字段进行索引 |
Geospatial Index | 地理坐标索引,提供了2d indexes(平面几何) 和2dsphere indexes(球面几何) |
Text Search Indexes | 支持文本搜索的索引,类似于elasticsearch |
Hashed Indexes | HASH索引,提供最快的值查询,但不支持范围查询 |
Clustered Indexes | clustered collections支持的index |
1.6 MongoDB 的持久化
MongoDB 的日志叫 journal。
write concern
write concern
是用于控制数据持久化的保证级别。
要注意公有云的性能测试使用的测试方法,比如腾讯云的这个测试方法: https://cloud.tencent.com/document/product/240/106644 , “w = 0表示写操作不需要确认,即不需要等待写操作的响应”,也就是说,测试时都是不确认是否写成功就返回的。
基本格式:
{w: <value>, j: <boolean>, wtimeout: <number>}
write concern
大致可以分为下面几种类别 [2]:
1、{w: 0}
表示写不确认,不确认写操作是否完成,可能发生数据的丢失。
2、{w: 1}
表示写确认,为 MongoDB 5.0 以前的默认行为。默认写操作在内存中完成,但由于还没有持久化,依然可能发生数据丢失。
3、{j: true}
表示日志 (journal) 确认。确认写操作已完成并刷到持久化存储的 WAL 中,写操作不会丢失。
4、{w: "majority"}
表示大多数(majority),为 MongoDB 5.0 及以上版本的默认行为。等待写操作被复制到副本集大多数节点上后才确认,数据不会被回滚。
关于 write concern 的一些注意点 [2]:
-
可以设置服务器的默认的 write concern,操作的 write concern 的优先级高于服务端设置的 write concern。
-
因果一致性会话里,必须使用 “majority” 的 write concern。
-
副本集中的隐藏节点、延迟节点、或其他优先级为0的可投票节点均可视为 “majority” 中的一员。
-
当写入 local 库时,write concern 会被忽略。
参考:
1.7 MongoDB Oplog
1.8 MongoDB wiredtiger 引擎
参考文档:
从 MongoDB 3.2 开始,WiredTiger 成为默认的存储引擎。
2. 参考
[1] sevenll07. MongoDB 概念及基础CRUD. Available at https://blog.csdn.net/weixin_38980638/article/details/136994894, 2024-3-24.
[2] 阿里云. 事务与Read/Write Concern. Available at https://help.aliyun.com/zh/mongodb/use-cases/transactions-and-read-write-concern, 2024-6-4.