No | 关系型数据库 | NoSQL数据库 |
---|---|---|
1 | 数据库 | 数据库(相似MySQL) |
2 | 表 | 集合 |
3 | 行 | 文档 |
4 | 列 | 成员 |
5 | 主键 | ObjectID(自动维护) |
MogoDB是一款强大、灵活且易于拓展的通用型数据库。它能拓展出很是多的功能,好比二级索引、返回查询、排序、聚合,以及地理空间索引。javascript
MongoDB是一个面向文档的数据库,不是关系型数据库。文档中的键和值再也不是固定的类型和大小。java
业务数据增加到必定程度时须要拓展数据库,有两种方式能够进行拓展:sql
MongoDB采用横向拓展的方式。面向文档的数据模型使它很容易在多台服务器之间进行数据分割。MongoDB可以自动处理跨集群的数据和负载,自动从新分配文档,以及将用户请求分配到正确的机器上。mongodb
MongoDB具备如下功能:数据库
索引json
MongoDB支持二级索引,容许多种快速查询,提供惟一索引、复合索引、地理空间索引,以及全文索引。数组
聚合缓存
MongoDB支持“聚合管道”。用户可以经过简单的片断建立复杂的聚合,并经过数据库自动优化。服务器
特殊的集合类型session
MongoDB支持存在时间有限的集合,适用于那些将在某个时刻国企的数据,如会话(session)。MongoDB也支持固定大小的集合,用于保存近期数据,如日志。
文件存储
MongoDB支持一种很是易用的协议,用于存储大文件和文件元数据。
MongoDB不具有一些关系型数据库很广泛的功能,如链接和复杂多行事务。
MongoDB的一个主要目标是提供卓越的性能。MongoDB能对文档动态填充,也能预分配数据文件以利用额外的空间换区稳定的性能。MongoDB把尽量多的内存用做缓存,试图为每次查询自动选择正确的索引。
下载
配置MongoDB环境变量
D:\devTools\MongoDB\Server\4.0\bin
配置文件存储路径
安装目录下新建一个data目录
修改配置信息
D:\devTools\MongoDB 目录下创建mongodb.conf
dbpath=
是的
文档是MongoDB的核心概念。文档就是键值对的一个有序集。好比
{"greeting": "hello world!"}
这个文档只有一个键“greeting,其对应的值为”hello world! "。
文档的键是字符串。除了少数例外状况,键可使用任意UTF-8字符。
MongoDB不区分类型,但区分大小写。
{"foo": 3}和{"foo":"3"}是相同的 {"foo":3}和{"Foo":3}是不一样的
MongoDB中不能有重复的键。
集合是动态模式的。这意味着集合里面的文档能够是各式各样的。下面两个文档能够放在同一个集合里:
{"greeting": "hello, world!"} {"foo": 5}
文档里面的值的类型能够不一样,键的类型也能够不一样
那为何还要使用多个集合呢?
集合使用名称进行标识。集合名须要知足下列条件任意的UTF-8字符串。
子集合
组织集合的一种惯例是使用“.”分割不一样命名空间的子集合。例如一个具备博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors。这是为了使组织结构更清晰,这里的blog集合跟他的子集合是没有任何关系的。
MongoDB中,多个文档组成集合,而多个集合能够组成数据库。一个MongoDB能够承载多个数据库,每一个数据库拥有0个或多个集合。每一个数据库都有独立的权限。
数据库名需知足如下任意UTF-8的字符串
数据库最终会变成文件系统中的一个文件,数据库名即对应的文件名,这也是数据库名有诸多限制的缘由。
admin、local、config 这些数据库名是保留的。
数据库名+集合名=命名空间
启动并指定数据库
mongod --dbpath d:/devtools/mongodb.db
启动并指定数据库和端口号
mongod --dbpath d:/devtools/mongodb.db --port=77777
查看数据库
show database
启动并制定配置文件
mongod -f d:/devtools/mongodb/mongodb.conf
使用指定数据库
use db1
1.带条件删除
db.user.remove({"name":"zhangshan"});
2.删除全部数据
db.user.remove({})
3.删除集合
db.user.drop()
4.删除整个数据库
show dbs;
db.user.getDB()
db.dropDatabase()
db.infos.insert({"url":"www.hanggle.com"}) db.infos.insert([{"url":"www.hanggle.com"}, {"url":"www.hanggle.com"}]) for(var i=0; i<10; i++){ db.infos.insert({"url":"www.hanggle.com-"+ i}) }
查询全部
db.infos.find();
查询url为"www.hanggle.com"的数据
db.infos.find({"url":"www.hanggle.com"});
查询url为"www.hanggle.com"的数据且id不显示
db.infos.find({"url":"www.hanggle.com"}, {"_id":0});
查询url为"www.hanggle.com"的数据,数据漂亮显示
db.infos.find({"url":"www.hanggle.com"}).pretty();
$gt | $gte | $ne | $lt | $lte |
---|---|---|---|---|
大于 | 大于等于 | 不等于 | 小于 | 小于等于 |
查询age>20的记录
db.course.find({"age":{"$gt":20}}).pretty();
查询age大于等于20的记录
db.course.find({"age":{"$gte":20}}).pretty();
查询age不等于20的记录
db.course.find({"age":{"$ne":20}}).pretty();
$and | $or | $not/$nor |
---|---|---|
与 | 或 | 非 |
查询age大于等于18,且小于等于20的记录
db.course.find({"age": {"$gte": 18, "$lte": 20}})
查询age>18或score>80的记录
db.course.find({"$or": [{"age": {"$gt":18}},{"score":{"$gt": 80}}]})
查询age>18而且score<80的记录
db.course.find({"$and": [{"age": {"$gt":18}},{"score":{"$lt": 80}}]})
查询age不大于18而且score不小于80的记录
db.course.find({"$nor": [{"age": {"$gt":18}},{"score":{"$lt": 80}}]})
$all | ¥ | |
---|---|---|
查询全部 |
查询数组中包含语文数学的记录
db.course.find({"course": {"$all": ["语文", "数学"]}})
查询数组中坐标1的数据为数学的记录
db.course.find({"course.1": "数学"})
查询数组size为3的记录
db.course.find({"course": {"$size":3}})
-- 有问题 查询数组前两条数据
db.course.find({"course": {"$slice": 2}})
-- 有问题 查询数组后两条数据
db.course.find({"course": {"$slice": 2}})
-- 有问题 查询数组中index1-2坐标数据两条数据
db.course.find({"course": {"$slice": [1, 2]}})
查询存在course的记录
db.course.find({"course": {"$exists": true}})
查询不存在course的记录
db.course.find({"course": {"$exists": false}})
不建议使用
基础语法:{key: 正则标记}
完整语法:{key:{"$regex":正则标记, "$options":选项}}。
对于options主要是设置正则的信息查询的标记:
- "i": 忽略字母大小写
- "m":多行查找
- "x": 空白字符串除了被转义的或在字符串类中意外的彻底被忽略
- "s":匹配全部的字符(圆点、“.”),包括换行内容。
须要注意的是:若是是直接使用(javascript),那么只能使用i和m,而“x”和“s”必须使用$regex
模糊查询那么包含A的记录
(1) db.course.find({"name": /A/i}) (2) db.course.find({"name": {"$regex":/A/i}})
模糊查询数组那么包含“数”的记录
db.course.find({"course": {"$regex":/数/i}})
按分数倒序排序(-1),正序排序(1)
db.course.find().sort({"score": -1})
天然排序 倒序排序(-1),正序排序(1)
db.course.find().sort({"$natural": 1})
删除course集合
db.course.drop()
删除集合course中url为www.hanggle.com的数据
db.course.remove({"url":"www.hanggle.com"});
删除course中全部数据
db.user.remove({})
按score倒序排序跳过1条取2条
db.course.find().skip(1).limit(2).sort({"score": -1})
db.infos.getIndexes()
在集合infos上的age列建立升序索引
db.infos.ensureIndex({"age":1})
查询age=19的数据,FETCH表示正在使用索引
db.infos.find({"age":{"$eq":19}}).explain();
sql加上hint() 表示强制使用索引,强制使用索引只能使用已存在的索引。
db.infos.find({"$or":[{"age":{"$eq":19}},{"name":{"$eq":"haha"}}]}).hint().explain();
删除集合上age列的正序索引
db.infos.dropIndex({"age":1});
删除infos上除_id其它的全部索引
db.infos.dropIndexes();
在infos上建立name惟一索引
db.infos.ensureIndex({"name":1},{"unique": true});
若是增长重复数据会有如下提示信息
E11000 duplicate key error collection: mydb.infos index: name_1 dup key: { : "张三" }
过时索引用于延时自动珊瑚记录的一种索引。它仅包含一个字段,改字段为Date类型,而且不支持复合索引。能够指定某条记录在延时固定时间后自动删除。数据自动超时删除主要用在系统生成的事件、日志或者会话信息等不须要永久存储的数据。超时时间是不许确的
- 注意事项
- TTL索引仅支持一个字段,不能支持复合索引。
- _id字段不支持TTL索引。
- 不能再固定大小的集合上建立TTL索引。
- 不能经过createIndex()接口来改变expireAfterSeconds的值,能够经过"collMod"命令,或者先删除再建立的方式。
- 不能在已经创建索引的字段建立TTL索引。
在phone的time字段上设置过时索引,过时时间为10s
db.phones.ensureIndex({"time":1}, {expireAfterSeconds:10});
统计info中数据个数,count能够加参数
db.infos.count();
查询course中name去重数据
db.runCommand({"distinct":"course","key":"name"})
Group查询都是无序的
db.emps.insert({"name":"AAA", "dept":"部门A", "tel":110, "salery":2000, "sex":"W"});
db.emps.insert({"name":"BBB", "dept":"部门A", "tel":120, "salery":7000, "sex":"M"});
db.emps.insert({"name":"CCC", "dept":"部门B", "tel":130, "salery":4000, "sex":"W"});
db.emps.insert({"name":"DDD", "dept":"部门B", "tel":140, "salery":1000, "sex":"M"});
db.emps.insert({"name":"EEE", "dept":"部门B", "tel":150, "salery":2000, "sex":"W"});
查询emps每一个部分的人数
db.emps.aggregate([{"$group":{"_id":"$dept", emp_count:{"$sum": 1}}}]);
查询每一个部门总工资
db.emps.aggregate([{"$group":{"_id":"$dept", salery_count:{"$sum": "$salery"}}}]);
查询每一个人的平均工资
db.emps.aggregate([{"$group":{ "_id":"$dept", salery_sum:{"$sum": "$salery"}, salery_avg:{"$avg": "$salery"} }}]);
查询每一个分组的数据
db.emps.aggregate([{"$group":{ "_id":"$dept", sal_data:{"$push": "$salery"} }}]);
查询每一个分组最大值和最小值
db.emps.aggregate([{"$group":{ "_id":"$dept", sal_data:{"$push": "$salery"} }}]);
控制_id列不显示,name列显示
db.emps.aggregate([{"$project":{ "_id":0, "name":1}}]);
project使用的是数据库投影机制,投影过程当中也能够进行加减乘除运算,
乘法运算:
db.emps.aggregate([{"$project":{ "_id":0, "name":1, "salery":{ "年薪":{"$multiply":["$salery",12]} }}}])
MongoDB默认不使用用户名密码,使用密码要具有如下条件:
- 服务器启动时打开受权认证
- 设置用户名密码
db.createUser({ "user":"hanggle", "pwd":"hanggle", "roles":[{"role":"readWrite", "db":"mydb"}] })
db.changeUserPassword("mongodb", "mongodb")