MongDB介绍

2020-04-14  本文已影响0人  鬼厉

13和14获得年度数据库.https://db-engines.com/en/ranking

官方文档: https://docs.mongodb.com/manual/

简介

MongoDB是面向文档的数据库, 有区别与传统的RDBM, 是一个基于文档(BSON, Binary Json)存储的开源数据库系统, 其主要的大致特性如下:

主要用途

BSON与JSON对比

https://docs.mongodb.com/manual/reference/bson-types/

Bson是一种类Json的一种二进制形式的存储格式,类型比Json要丰富, 空间存储不占优势, 更快的查询速度, 操作简单, 在MongoDB的大小限制是16mb, 每一个document都需要一个_id.

版本进展

基础知识

主要有文档, 集合, 数据库, 键id, js shell.

比如设计父子结构: blog.posts, blog.authors, 其中blog这个父集合甚至不需要存在, 父子集合可以进行逻辑&物理上的分隔, 十分有用.

保留数据库: admin, local, config. 集合的完全限定名是cms.blog.posts, 其中cms是数据库的名字.

插入:db.blog.insert({x:5}) 查询: db.blog.findOne(),或者find(). 更新:db.blog.update(...) 删除:db.blog.remove(...)

ObjectId在集合内唯一标志文档的id,11位int值, 使用不需要管, 会自动生成_id的key, 值的话跟时间戳,机器, pid以及计数器有关的hash值.

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash">> db.blog.insert({x:1})
WriteResult({ "nInserted" : 1 })

db.blog.find()
{ "_id" : ObjectId("5e81c27c40ba929757681642"), "x" : 1 }</pre>

db和集合的增删

db不用创建, 直接use,或者insert数据后show dbs就能看到了

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash"># 删除db
db.dropDatabase()

创建集合options是一个json配置, json Schema

db.createCollection(name, options)

删除集合

db.collection.drop()</pre>

json schema是无模式下的规范, https://docs.mongodb.com/manual/reference/operator/query/jsonSchema/

基本操作CRUD

具体语言的操作去看开头的官方文档.

create

insertOne/insertMany/insert

read

find/findOne

update

主要通过操作符, 第一个参数是find的条件,第二个参数是操作.

<pre class="md-fences md-end-block ty-contain-cm modeLoaded">db.users.update({"name":"huija"},{"$set":{"xxx":1}})</pre>

delete

deleteOne/deleteMany

还有个remove, 过时了,可以使用, 不会释放db的空间, 需要db.repairDatabase()来回收.

简单实践

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash"># 增加

db.users.insert({"name":"huija","friends":32,"enemies":2})
WriteResult({ "nInserted" : 1 })

改update

db.users.find()
{ "_id" : ObjectId("5e82abb48c7542360d1e5434"), "name" : "huija", "friends" : 32, "enemies" : 2 }
var me=db.users.findOne({"name":"huija"})
me.relationships={"friends":me.friends,"enemies":me.enemies}
{ "friends" : 32, "enemies" : 2 }
delete me.friends
true
delete me.enemies
true
db.users.update({"name":"huija"},me)

查find,findOne

db.users.find({"name":"huija"})
{ "_id" : ObjectId("5e82abb48c7542360d1e5434"), "name" : "huija", "relationships" : { "friends" : 32, "enemies" : 2 } }

删remove,drop

db.users.drop()
true</pre>

但是上面的update,基本是整体覆盖, 如果想要针对单个属性,进行原子更新, 可以通过修改器实现.

updateOne, updateMany可以控制update的文档数目(1个或者多个)

_id最好不要自己设置

https://www.jianshu.com/p/9e582b470810 https://www.runoob.com/mongodb/mongodb-objectid.html

索引

创建很简单:db.col.createIndex({"title":1,"description":-1})

其中1表示升序, -1表示降序.

https://www.runoob.com/mongodb/mongodb-indexing.html

索引是B树, 需要全部加载进内存.

https://www.runoob.com/mongodb/mongodb-indexing-limitations.html

覆盖索引

mysql的覆盖索引主要是为了不回表, 在mongodb中也是类似, 我们可以 通过指定需要查询的值来达到目的.

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="bash">db.users.find({gender:"M"},{user_name:1,_id:0})</pre>

其中1表示需要查出user_name, 0表示忽略默认就返回的_id.

mongodb还支持数组等各种子文档的索引

TTL索引

可以用于删除过期数据, ttl索引只支持在Date()类型单字段建立

当你在集合中某一个字段建立TTL索引后,后台会有一个单线程,通过不断查询(默认60s一次)索引的值来判断document是否有过期,
并且删除文档的动作还依据mongod实例的负载情况,如果负载很高,可能会稍微延后一段时间再删除。
还有一个需要注意的地方,在复制集成员中,TTL后台线程只删除primary的过期数据,如果此实例变为secondary角色,则后台线程闲置

https://blog.csdn.net/leshami/article/details/61195427

聚合

是一个pipeline处理, 指定一些聚合的组合,每一个聚合都是一个stage步骤, 整体作为参数进行聚合操作. db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

https://www.runoob.com/mongodb/mongodb-aggregate.html

聚合框架中常用的几个操作:

引用

对于Bson的类型, 我们可以类比结构体, 而结构体是可以嵌套组合的, 而Bson如何实现文档的组合呢, 比较Bson是无范式的, 是很灵活的.

使用ObjectID, 类似地址一样, 进行组合.

<pre class="md-fences md-end-block ty-contain-cm modeLoaded" lang="json">{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}</pre>

但是这只是文档的直接引用, 如果需要从多个db集合进行引用也是可以的, 具体需要指定一些额外参数.

优势

工具

compass可以查看数据, 聚合计算, schema分析, 索引查看, 图形化explain, 制定一些schema约束(哪些key必须有, 哪些key的类型限定等等)

选型总结

如果业务满足一个或多个特点,那么选择MongoDB是个正确的决定:

上一篇 下一篇

猜你喜欢

热点阅读