1 前言
mongodb中一个 表就是 collections 集合
集合不强制执行任何模式,完全有可能使用单个集合与json文件混杂 构建一个系统,但这将是一个非常糟糕的主意。大多数 MongoDB 系统的布局有点类似于你会在关系系统中找到什么。
尽管集合collections较少。换句话说,如果它是关系数据库中的表数据库,它有可能是 MongoDB中的一个集合(多对多连接表是一个重要的例外,因为多对多仅用于启用与简单实体的一对多关系的表)
当您考虑嵌入文档时,对话会变得更加有趣。比如一个博客。
你应该有一个帖子集合和一个评论集合,还是每个帖子都有一个数组嵌入其中的评论?
暂时允许 16MB 的文件大小限制(所有的都小于超过200KB,那么您的博客有多受欢迎?),
大多数开发人员应该更愿意将内容分开。为了更干净,为您提供更好的性能和更明确的内容。
MongoDB 灵活的模式允许您将两者结合起来,通过将评论保留在自己的集合中但在其中嵌入一些评论(可能是前几条)的方法。
博客帖子,以便能够在帖子中显示它们。这遵循将您想要的数据保存在一起的原则。
返回一个查询。没有硬性规定(除了 16MB)。尝试不同的方法。 将有不同的发现。
面向文档系统中的建模与关系世界中的建模有所不同,但也没有太大不同。在mongodb中你有更多的灵活性和一个约束。
1 安装
ubuntu20
导入密钥
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
检查公钥
sudo apt-key list
创建安装列表
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
加载本地安装工具的配置
sudo apt-get update
linux centos install mongo
centos7
新建配置文件 /etc/yum.repos.d/mongodb-org-4.4.repo[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
2 mongo 主从配置
主启动 mongod --config /etc/mongodb.conf --master
副启动 # mongod --config /etc/mongodb.conf --slave --autoresync --slavedelay=10 --source master-ip:master-port
3 引擎对比:mongoengine & pymongo
存入操作:save 参数解释
:param force_insert: 只新增数据,不去更新mongo中已有的数据
:param validate: 默认验证数据 文件合法性 False为不验证; set to ``False`` to skip.
:param clean: 调用文档清理方法。 call the document clean method, requires `validate` to be True.
:param write_concern: 传递额外关键字参数给 pymongo 将作为结果选项 # Extra keyword arguments are passed down to
:meth:`~pymongo.collection.Collection.save` OR
:meth:`~pymongo.collection.Collection.insert`
which will be used as options for the resultant
``getLastError`` command. For example,
``save(..., write_concern={w: 2, fsync: True}, ...)`` will
wait until at least two servers have recorded the write and
will force an fsync on the primary server.
:param cascade: 设置级联保存的标志。你可以设置一个
默认通过设置“级联” Sets the flag for cascading saves. You can set a
default by setting "cascade" in the document __meta__
:param cascade_kwargs: 要传递的 kwargs 字典 throw
级联保存。 (optional) kwargs dictionary to be passed throw
to cascading saves. Implies ``cascade=True``.
:param _refs: 级联保存中使用的已处理引用列表 A list of processed references used in cascading saves
:param save_condition: 仅在匹配数据库中的记录时才执行保存
满足条件 only perform save if matching record in db
satisfies condition(s) (e.g. version number).
Raises :class:`OperationError` if the conditions are not satisfied
:param signal_kwargs: 要传递给的 kwargs 字典
信号呼叫 (optional) kwargs dictionary to be passed to
the signal calls.
4 性能工具
索引 indexes
创建索引
// where "name" is the field name
db.unicorns.ensureIndex({name: 1});
删除索引
db.unicorns.dropIndex({name: 1});
唯一索引 unique index
db.unicorns.ensureIndex({name: 1}, {unique: true});
在嵌入式 数据中 创建索引
db.unicorns.ensureIndex({name: 1, vampires: -1});
查看查询是否使用索引
db.unicorns.find().explain()
db.unicorns.find({name: 'Pilot'}).explain()
5 备份/恢复
mongodump/mongorestore
配置主从 之后,数据将 异步的 复制到每个节点。
如果主 数据库 掉线,其中一个 备数据库将 立即成为主数据库。
分片 shrding
mongodb 支持自动分片。 分片可 跨多个服务器 和 客户端访问数据
分片是mangodb 客机 缩放的主要方式。
主从集群 是mongodb达到规模应用的主要方式。
6 触发器
创建触发器
db.setProfilingLevel(2);
使用
db.unicorns.find({weight: {$gt: 600}});
另一个方式
db.system.profile.find()
//profile anything that takes
//more than 1 second
db.setProfilingLevel(1, 1000);
7 备份 与 恢复 数据
备份
mongodump --db learn --out backup
回滚数据
mongorestore --db learn --collection unicorns backup/learn/unicorns.bson
导入数据 支持json 或 csv格式
mongoexport --db learn --collection unicorns
导出数据
mongoexport --db learn --collection unicorns --csv --fields name,weight,vampires
8 启动和指令使用
启动
sudo systemctl start mongod
重启
sudo systemctl reload mongod
停止
sudo systemctl stop mongod
日志
sudo tail /var/log/mongodb/mongod.log
检查是否启动
systemctl is-enabled mongod; echo $?
如果是disable,执行命令启动
sudo systemctl enable mongod
退出
exit
9 全文 索引
支持数组 arrays 和全文 full text search
事务
$inc and $set注意该操作 原子性不安全。
复杂聚合查询
aggregation 聚合框架 pipeline管道
MapReduce 可解决 集合 和 管道问题。
首先 映射 map, 然后压缩 reduce
超大数据的并行处理,请使用 Hadoop
mongodb 有相关的 插件提供 连接到 Hadoop
实现一个类似SQL的 count()
db.unicorns.aggregate([{$group:{_id:'$gender',total: {$sum:1}}}])
在 shell 中,我们有一个聚合助手,它接受一组管道运算符。
对于一个简单的计数分组通过某种方式,我们只需要一个这样的运算符。
$group.
10 小结
有许多足够新和竞争的存储技术,很容易被所有选择所淹没。
不再需要是依赖处理数据的单一解决方案。 虽然单一方案优势明显,可以适用于大多方案。
不是你必须使用不同的技术,而是你可以使用不同的技术。只有您知道引入新解决方案的好处是否大于成本。
mongdb 也可以作为一种 通用的存储方案。 a general solution. 文件关系型数据库。
与关系数据库有很多共同之处。 我们可以简单地说一下 MongoDB 应该被视为直接替代关系数据库。
Redis 作为增强关系数据库作为持久的键值存储,MongoDB 是您数据的中央存储库。 mongodb不是关系数据库的替代品
架构灵活性 Flexible Schema,面向文档的数据库的一个经常被吹捧的好处是它们不强制执行固定模式。
这让他们比传统的数据库表更灵活。我同意灵活的模式是一个很好的特性,但不是主要的。
无模式schema-less,就好像你将突然开始存储疯狂的 各种数据。
而关系型数据库中使用模型时,域和数据集真的让人很痛苦。
无模式是很酷,但你的大部分数据都将是高度结构化的。因为偶尔不匹配将让人感觉很方便。
当我们引入一个新的功能时,一个可能是空的列 根本不会引起任何问题,mongodb自动处理它。
动态模式的真正好处,较少的设置和 减少与 OOP 的摩擦。动态及其流行的成熟度, 实现已经减少了很多对象关系阻抗 和 不匹配。
从驱动开发者的角度考虑,你只需要把数据 转换为json(mongodb中的BSON),就可以存储。没有关系数据中的属性映射或类型映射。 这是可以提升效率的。
下一节,我们举例指令和使用第三方库。