1.定义
一个非关系型数据库,也称为文档型数据库。虽然是非关系数据库,但是其实在使用过程,我觉得这玩意是最像关系型数据库的nosql了,因为相对于另一种常见的非关系数据库redis来说,至少它还有点关系型数据库的影子。
2.特点
①高性能:支持嵌入式模型,减少数据库系统上的IO驱动,当然也支持索引。
②高可用性:副本集(replica set)使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。
③高扩展性:提供水平扩展性,支持分片将数据分布在一组集群的机器上。
④丰富的查询支持:常见的crud,以及数据聚合、文本搜索和地理空间查询等。
⑤动态模式,结构灵活。
3.应用场景
适用于数据量大、写入操作频繁、对事务性要求不高、数据模型未完全确定需求可能改变、大量地理位置查询、文本查询。
4.结构
对于其支持的数据结构,称为BSON,和JSON不能说很像,只能说一模一样,不过BSON有JSON没有的一些数据类型,如Date和BinData类型。
4.1与mysql对比
SQL | MongoDB | 解释 |
database | database | |
table | collection | |
row | document | |
table joins | 表连接,MongoDB不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来替代多表连接 | |
primary key | primary key | MongoDB自动将_id字段设置为主键 |
5.数据模型
6.基本crud操作
6.1查询
db.collection.find(<query>, [projection])
query:筛选条件
projection:投影
//示例
>db.student.find({user_id:"1003"},{user_id:1,nickname:1})
>{ "_id" : "4", "user_id" : "1003", "nickname" : "EMT" }
//如果不想显示主键,则加上_id,如下
>db.student.find({user_id:"1003"},{user_id:1,nickname:1,_id:0})
//至于还有什么findOne,findMany就不多说了,懂点英语,就知道就是字面意思
6.2插入
db.collection.insert(document);
document:要插入到集合中的文档或文档数组。(json格式)
//当然里面还可以放其他参数,但是可能用得比较少,更详细的自己看官方文档即可
//其实insert就能实现批量和单个插入了,insertMany和insertOne也是字面意思。
6.3修改
//两种
//覆盖原文档
>db.student.update({_id:"1"},{nickname:"emt"})
//这个会将id为1的原文档直接覆盖掉
//仅修改指定的值,不完全覆盖原来的
>db.student.update({_id:"1"},{$set:{nickname:"emt"}})
//默认只更新一条数据,如果要批量更新,需要加上multi参数
>db.student.update({sex:"1"},{$set:{nickname:"emt"}},{multi:true})
//当然updateOne()和updateMany()还是字面意思
6.4删除
删除在实际中用得少,一般都是逻辑删除
db.collection.remove(query)
query:筛选条件
7.其他常见查询方式
7.1分页查询
//查总数
db.collection.count(query)
//查内容
>db.collection.find(query).skip(start).limit(size)
start:表示当前页第一条在总条数里面的索引位置,假如一个场景是一页10条,那么第二页的第一条索引是10(因为索引是从0开始,前十条是0~9),所有查询第二页的数据时start=10。
size:页大小
7.2排序查询
>db.collection.find().sort({KEY:n})
key:有排序要求的字段名
n:为1代表升序,-1代表降序
7.3比较查询
db.collection.find({ "field" : { $gt: value }}) // 大于: field > value
db.collection.find({ "field" : { $lt: value }}) // 小于: field < value
db.collection.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.collection.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.collection.find({ "field" : { $ne: value }}) // 不等于: field != value
7.4包含查询
//查询性别为男或女的学生
>db.student.find({sex:{$in:["0","1"]}})
//查询性别不男不女的学生(人妖了属于是)
>db.student.find({sex:{$nin:["0","1"]}})
7.5条件连接查询
$and:[ { },{ },{ } ]
$or:[ { },{ },{ } ]
//例如,查询体重小于60kg的男学生
>db.student.find({$and:[ {sex:"1"} ,{weight:{$lt:60} }]})
8.索引
#创建索引
>db.collection.createIndex(keys, options)
keys:实则{key:n},其中key是字段,n为1表示升序索引,-1表示降序索引。
options:参数较多,大部分用得少,详细的可以看官方文档
#删除某个索引
>db.collection.dropIndex(keys)
keys:同上
#删除集合中所有索引
>db.collection.dropIndexes()
#获取集合中所有索引
>db.collection.getIndexes()
索引包括单字段索引、符合索引、其他(地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)),括号中的索引具体可查阅相关资料,不多赘述。