数据库管理系统主要分为俩大类:RDBMS、NOSQL。在我的电脑、大型计算机和主机上应用最普遍的数据库管理系统是关系型DBMS。NoSQL是对不一样于传统的关系数据库的数据库管理系统的统称。html
二者最重要的不一样点是NoSQL不使用SQL做为查询语言。其数据存储能够不须要固定的表格模式,也常常会避免使用SQL的JOIN操做,通常有水平可扩展性的特征。linux
常见的数据库管理系统,及其排名状况以下:git
NoSQL中的四你们族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有如下这些。github
存储类型mongodb |
NoSQLshell |
|
键值存储数据库 |
最终一致性键值存储express |
Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort编程 |
内存键值存储json |
Memcached、Redis、Oracle Coherence、NCache、Hazelcast、Tuple space、Velocity |
|
持久化键值存储 |
BigTable、LevelDB、Tokyo Cabinet、Tarantool、TreapDB、Tuple space |
|
文档存储 |
MongoDB、CouchDB、SimpleDB、 Terrastore 、 BaseX 、Clusterpoint 、 Riak、No2DB |
|
图存储 |
FlockDB、DEX、Neo4J、AllegroGraph、InfiniteGraph、OrientDB、Pregel |
|
列存储 |
Hbase、Cassandra、Hypertable |
高可扩展性、分布式计算、没有复杂的关系、低成本
架构灵活、半结构化数据
NoSQL |
RDBMS |
表明着不只仅是SQL 没有声明性查询语言 没有预约义的模式 键 - 值对存储,列存储,文档存储,图形数据库 最终一致性,而非ACID属性 非结构化和不可预知的数据 CAP定理 高性能,高可用性和可伸缩性 |
高度组织化结构化数据 结构化查询语言(SQL) (SQL) 数据和关系都存储在单独的表中。 数据操纵语言,数据定义语言 严格的一致性 基础事务
|
除了上图所示的3大技术特点还支持:
二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、内存引擎 、地理分布等一系列的强大功能。
可是其也有些许的缺点,例如:
多表关联: 仅仅支持Left Outer Join
SQL 语句支持: 查询为主,部分支持
多表原子事务: 不支持
多文档原子事务:不支持
16MB 文档大小限制,不支持中文排序 ,服务端 Javascript 性能欠佳
存储方式对比
在传统的关系型数据库中,存储方式是以表的形式存放,而在MongoDB中,以文档的形式存在。
数据库中的对应关系,及存储形式的说明
MongoDB与SQL的结构对比详解
SQL Terms/Concepts |
MongoDB Terms/Concepts |
database |
database |
table |
collection |
row |
document or BSON document |
column |
field |
index |
index |
table joins |
embedded documents and linking |
primary key Specify any unique column or column combination as primary key. |
primary key In MongoDB, the primary key is automatically set to the _id field. |
aggregation (e.g. group by) |
aggregation pipeline See the SQL to Aggregation Mapping Chart. |
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前不少编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON数据库语句能够容易被解析。
Web 应用大量使用,NAME-VALUE 配对
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的缘由主要是JSON的通用性及JSON的schemaless的特性。
二进制的JSON,JSON文档的二进制编码存储格式
BSON有JSON没有的Date和BinData
MongoDB中document以BSON形式存放
> db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
📢 MongoDB是开源产品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有开源的社区版本
📢 起源& 赞助by MongoDB公司,提供商业版licenses 许可
这些优点造就了mongodb的丰富的功能:
JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS
MySQL InnoDB |
MySQL NDB |
Oracle |
MongoDB MAPI |
MongoDB WiredTiger |
|
事务 |
YES |
YES |
ES |
NO |
NO |
锁粒度 |
ROW-level |
ROW-level |
ROW-level |
Collection-level |
Document-level |
Geospatial |
YES |
YES |
YES |
YES |
YES |
MVCC |
YES |
NO |
YES |
NO |
NO |
Replication |
YES |
YES |
YES |
YES |
YES |
外键 |
YES |
YES(From 7.3) |
YES |
NO |
NO |
数据库集群 |
NO |
YES |
YES |
YES |
YES |
B-TREE索引 |
YES |
YES |
YES |
YES |
YES |
全文检索 |
YES |
NO |
YES |
YES |
YES |
数据压缩 |
YES |
NO |
YES |
NO |
YES |
存储限制 |
64TB |
384EB |
NO |
NO |
NO |
表分区 |
YES |
YES |
YES |
YES (分片) |
YES (分片) |
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
在下面的表格中进行选择,但有1个yes的时候:能够考虑MongoDB;当有2个以上yes的时候:不会后悔的选择!
应用特征 |
Yes/No? |
个人数据量是有亿万级或者须要不断扩容 |
|
须要2000-3000以上的读写每秒 |
|
新应用,需求会变,数据模型没法肯定 |
|
我须要整合多个外部数据源 |
|
个人系统须要99.999%高可用 |
|
个人系统须要大量的地理位置查询 |
|
个人系统须要提供最小的latency |
|
我要管理的主要数据对象<10 |
慎用场景 |
缘由 |
PB 数据持久存储大数据分析数据湖 |
Hadoop、Spark提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark |
搜索场景:文档有几十个字段,须要按照任意字段搜索并排序限制等 |
不建索引查询太慢,索引太多影响写入及更新操做 |
ERP、CRM或者相似复杂应用,几十上百个对象互相关联 |
关联支持较弱,事务较弱 |
须要参与远程事务,或者须要跨表,跨文档原子性更新的 |
MongoDB 事务支持仅限于本机的单文档事务 |
100% 写可用:任什么时候间写入不能停 |
MongoDB换主节点时候会有短暂的不可写设计所限
|
MongoDB官网:https://www.mongodb.com/
CentOS6.X版本软件下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62
在安装以前首先确认该版本软件是否支持你的操做系统。
更多详情查看:https://docs.mongodb.com/manual/installation/
Platform |
3.6 Community & Enterprise |
3.4 Community & Enterprise |
3.2 Community & Enterprise |
3.0 Community & Enterprise |
RHEL/CentOS 6.2 and later |
✓ |
✓ |
✓ |
✓ |
RHEL/CentOS 7.0 and later |
✓ |
✓ |
✓ |
✓ |
系统环境说明:
[root@MongoDB ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@MongoDB ~]# uname -r 2.6.32-696.el6.x86_64 [root@MongoDB ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@MongoDB ~]# getenforce Disabled [root@MongoDB ~]# hostname -I 10.0.0.152 172.16.1.152
软件版本说明: 本次使用的mongodb版本为:mongodb-linux-x86_64-3.2.8.tgz
在root用户下操做
cat >> /etc/rc.local <<'EOF' if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi EOF
该方法仅限与CentOS系统使用,其余系统关闭参照官方文档:https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
Transparent Huge Pages (THP),经过使用更大的内存页面,能够减小具备大量内存的机器上的缓冲区(TLB)查找的开销。
可是,数据库工做负载一般对THP表现不佳,由于它们每每具备稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。
建立用户
groupadd -g 800 mongod useradd -u 801 -g mongod mongod
修改用户密码
echo 123456 |passwd --stdin mongod
建立程序目录
mkdir -p /application/mongodb/ &&\ cd /application/mongodb/ &&\ mkdir -p bin conf log data
下载程序
cd /application/mongodb/ wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz
解压程序
tar xf mongodb-linux-x86_64-3.2.8.tgz cd mongodb-linux-x86_64-3.2.8/bin/ &&\ cp * /mongodb/bin
修改程序属主
chown -R mongod:mongod /application/mongodb
切换到mongod用户,设置用户环境变量
su - mongod
cat >> .bash_profile <<'EOF' export PATH=/mongodb/bin:$PATH EOF source .bashprofile
至此,MongoDB数据库部署完成
数据库的启动与关闭
启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork 关闭:mongod --shutdown --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
参数说明:
参数 |
参数说明 |
--dbpath |
数据存放路径 |
--logpath |
日志文件路径 |
--logappend |
日志输出方式 |
--port |
启用端口号 |
--fork |
在后台运行 |
--auth |
是否须要验证权限登陆(用户名和密码) |
--bind_ip |
限制访问的ip |
--shutdown |
关闭数据库 |
登入数据库
[mongod@MongoDB ~]$ mongo MongoDB shell version: 3.2.8 connecting to: test >
普通格式配置文件:
cd /application/mongodb/conf/ [mongod@MongoDB conf]$ vim mongod1.conf dbpath=/application/mongodb/data logpath=/application/mongodb/log/mongodb.log port=27017 logappend=1 fork=1
使用配置文件时的启动与关闭:
启动:mongod -f mongod1.conf 关闭:mongod -f mongod1.conf --shutdown
YAML格式配置文件(3.X 版本官方推荐使用)
[mongod@MongoDB conf]$ cat mongod.conf systemLog: destination: file path: "/application/mongodb/log/mongod.log" logAppend: true storage: journal: enabled: true dbPath: "/application/mongodb/data" processManagement: fork: true net: port: 27017
在数据库中关闭数据库的方法
shell > mongo [mongod@MongoDB conf]$ mongo MongoDB shell version: 3.2.8 connecting to: test > db.shutdownServer() shutdown command only works with the admin database; try 'use admin' > use admin > db.shutdownServer() server should be down...
注:
mongod进程收到SIGINT信号或者SIGTERM信号,会作一些处理
> 关闭全部打开的链接
> 将内存数据强制刷新到磁盘
> 当前的操做执行完毕
> 安全中止
切忌kill -9 数据库直接关闭,数据丢失,数据文件损失,修复数据库(成本高,有风险)
使用kill命令关闭进程
$ kill -2 PID 原理:-2表示向mongod进程发送SIGINT信号。 或 $ kill -4 PID 原理:-4表示向mognod进程发送SIGTERM信号。
注:该脚本能够直接在root用户下运行
[root@MongoDB ~]# cat /etc/init.d/mongod #!/bin/bash # # chkconfig: 2345 80 90 # description:mongodb # by clsn # blog_url http://blog.nmtui.com ################################# MONGODIR=/application/mongodb MONGOD=$MONGODIR/bin/mongod MONGOCONF=$MONGODIR/conf/mongod.conf InfoFile=/tmp/start.mongo . /etc/init.d/functions status(){ PID=`awk 'NR==2{print $NF}' $InfoFile` Run_Num=`ps -p $PID|wc -l` if [ $Run_Num -eq 2 ]; then echo "MongoDB is running" else echo "MongoDB is shutdown" return 3 fi } start() { status &>/dev/null if [ $? -ne 3 ];then action "启动MongoDB,服务运行中..." /bin/false exit 2 fi sudo su - mongod -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null if [ $? -eq 0 ];then action "启动MongoDB" /bin/true else action "启动MongoDB" /bin/false fi } stop() { sudo su - mongod -c "$MONGOD -f $MONGOCONF --shutdown" &>/dev/null if [ $? -eq 0 ];then action "中止MongoDB" /bin/true else action "中止MongoDB" /bin/false fi } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac
MongoDB的基本操做主要是对数据库、集合、文档的操做,包括建立数据库、删除数据库、插入文档、更改文档、删除文档、和查询文档。
Mongodb中关键字种类:
db(数据库实例级别)
db自己
db.connection 数据库下的集合信息
db.collection.xxx(
rs(复制集级别)
sh(分片级别)
在客户端指定数据库进行链接:(默认链接本机test数据库)
[mongod@MongoDB ~]$ mongo 10.0.0.152/admin MongoDB shell version: 3.2.8 connecting to: 10.0.0.152/admin > db admin
查看当前数据库版本
> db.version() 3.2.8
切换数据库
> use test; switched to db test
显示当前数据库
> db test > db.getName() test
查询全部数据库
> show dbs; --要显示数据库必须插入至少一条文档 clsn 0.000GB local 0.000GB test 0.000GB > show databases; clsn 0.000GB local 0.000GB test 0.000GB
查看数据库(clsn)当前状态
> use clsn; > db.stats() { "db" : "clsn", "collections" : 1, "objects" : 10000, "avgObjSize" : 80, "dataSize" : 800000, "storageSize" : 258048, "numExtents" : 0, "indexes" : 1, "indexSize" : 94208, "ok" : 1 }
查看当前数据库的链接机器地址
> db.getMongo() connection to 127.0.0.1
建立数据库
当use的时候,系统就会自动建立一个数据库。若是use以后没有建立任何集合。系统就会删除这个数据库。
> use clsn;
删除数据库
若是没有选择任何数据库,会删除默认的test数据库
> show dbs; clsn 0.000GB local 0.000GB test 0.000GB > use clsn switched to db clsn > db.dropDatabase() { "dropped" : "clsn", "ok" : 1 }
建立集合
方法一:
> use clsn; switched to db clsn > db.createCollection('a') { "ok" : 1 } > db.createCollection('b') { "ok" : 1 }
查看当前数据库中的全部集合
> show collections; a b > db.getCollectionNames() [ "a", "b" ]
方法二:
当插入一个文档的时候,一个集合就会自动建立。
> use clsn; switched to db clsn > db.c.insert({name:'clsn'}); --以{}包注,文档是以键值对出现的,必须成对设置 WriteResult({ "nInserted" : 1 }) > db.c.insert({url:'http://blog.nmtui.com'}); WriteResult({ "nInserted" : 1 })
查看建立的合集
> db.getCollectionNames() [ "a", "b", "c" ]
查看集合中的文档
> db.c.find() --若是括号内不加任何条件那么默认是显示全部的文档 { "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" } { "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" } > db.c.find({"uid":1}) --这里指定条件 { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
重命名集合
> db.c.renameCollection("clsn") { "ok" : 1 } > db.getCollectionNames() [ "a", "b", "clsn" ]
删除集合
> db.a.drop() true > db.getCollectionNames() [ "b", "clsn" ]
插入1w行数据
> for(i=0;i<10000;i++){
db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()});
} WriteResult({ "nInserted" : 1 })
查询集合中的查询全部记录:> db.log.find()
> DBQuery.shellBatchSize=50; # 每页显示50条记录 50 app> db.log.findOne() # 查看第1条记录 app> db.log.count() # 查询总的记录数 app> db.log.find({uid:1000}); # 查询UUID为1000的数据 --注:默认每页显示20条记录,当显示不下的的状况下,能够用it迭代命令查询下一页数据。
删除集合中的记录数
> db.log.distinct("name") # 查询去掉当前集合中某列的重复数据 [ "mongodb" ] > db.user.remove({"uid":1}) # 删除文档 WriteResult({ "nRemoved" : 1 }) # 当removed为1的时候说明删除成功 > db.log.remove({}) # 清空集合 WriteResult({ "nRemoved" : 10000 }) > db.log.distinct("name") [ ]
查看集合存储信息
> db.log.stats() # 查看数据状态 > db.log.dataSize() # 集合中数据的原始大小 > db.log.totalIndexSize() # 集合中索引数据的原始大小 > db.log.totalSize() # 集合中索引+数据压缩存储以后的大小 > db.log.storageSize() # 集合中数据压缩存储的大小
pretty()使用
> db.log.find({uid:1000}).pretty() { "_id" : ObjectId("5a4c5c0bdf067ab57602f7c2"), "uid" : 1000, "name" : "mongodb", "age" : 6, "date" : ISODate("2018-01-03T04:28:59.343Z") }
更新文档这里经过update方法括号内,第一个文档是查询的文档,第二个文档是修改成什么文档!
> db.user.update({"uid":3},{"uid" : 3, "name" : "shuaige", "salary" : 2000 }) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":3}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"), "uid" : 3, "name" : "shuaige", "salary" : 2000 } >
能够看到这个更新结果是咱们想要的结果,这种方式叫作 文档的替换方式更新
uid、salary均不须要变动,可是咱们都要写出来!
变量替换方式
咱们能够把取出来的值赋值给一个变量,而后经过变量去修改!
#把查询到的值赋值给a > a = db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 } > a.name luotianshuai4
#经过变量.字段名去修改字段的内容 > a.name="dashuaige" dashuaige > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 }
#而后在经过update更新 > db.user.update({"uid":4},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "dashuaige", "salary" : 7000 }
他的本质仍是替换的方式,只不过是方便了
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需建立数据库用户。
权限 |
说明 |
Read |
容许用户读取指定数据库 |
readWrite |
容许用户读写指定数据库 |
dbAdmin |
容许用户在指定数据库中执行管理函数,如索引建立、删除,查看统计或访问system.profile |
userAdmin |
容许用户向system.users集合写入,能够找指定数据库里建立、删除和管理用户 |
clusterAdmin |
只在admin数据库中可用,赋予用户全部分片和复制集相关函数的管理权限。 |
readAnyDatabase |
只在admin数据库中可用,赋予用户全部数据库的读权限 |
readWriteAnyDatabase |
只在admin数据库中可用,赋予用户全部数据库的读写权限 |
userAdminAnyDatabase |
只在admin数据库中可用,赋予用户全部数据库的userAdmin权限 |
dbAdminAnyDatabase |
只在admin数据库中可用,赋予用户全部数据库的dbAdmin权限。 |
root |
只在admin数据库中可用。超级帐号,超级权限
|
用户建立语法
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
语法说明:
user字段:用户的名字;
pwd字段:用户的密码;
cusomData字段:为任意内容,例如能够为用户全名介绍;
roles字段:指定用户的角色,能够用一个空数组给新用户设定空角色;
role字段:能够指定内置角色和用户定义的角色。
进入管理数据库:> use admin
建立管理用户,root权限
db.createUser( { user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] } )
注意:建立管理员角色用户的时候,必须到admin下建立。删除的时候也要到相应的库下操做。
查看建立完用户后的collections;
> show tables; system.users # 用户存放位置 system.version
查看建立的管理员用户
> show users { "_id" : "admin.root", "user" : "root", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] }
验证用户是否能用
> db.auth("root","root") 1 # 返回 1 即为成功
用户建立完成后在配置文件中开启用户验证
cat >>/application/mongodb/conf/mongod.conf<<-'EOF' security: authorization: enabled EOF
重启服务
/etc/init.d/mongod restart
登录测试,注意登录时选择admin数据库
注意:用户在哪一个数据库下建立的,最后加上什么库。
--方法一:命令行中进行登录 [mongod@MongoDB ~]$ mongo -uroot -proot admin MongoDB shell version: 3.2.8 connecting to: admin > --方法二:在数据库中进行登录验证: [mongod@MongoDB ~]$ mongo MongoDB shell version: 3.2.8 connecting to: test > use admin switched to db admin > db.auth("root","root") 1 > show tables; system.users system.version
建立对某库的只读用户
--在test库建立只读用户test use test db.createUser( { user: "test", pwd: "test", roles: [ { role: "read", db: "test" } ] } ) --测试用户是否建立成功 db.auth("test","test") show users; --登陆test用户,并测试是否只读 show collections; db.createCollection('b')
建立某库的读写用户
--建立test1用户,权限为读写 db.createUser( { user: "test1", pwd: "test1", roles: [ { role: "readWrite", db: "test" } ] } ) --查看并测试用户 show users; db.auth("test1","test1")
建立对多库不一样权限的用户
--建立对app为读写权限,对test库为只读权限的用户 use app db.createUser( { user: "app", pwd: "app", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" } ] } ) --查看并测试用户 show users db.auth("app","app")
删除用户
--删除app用户:先登陆到admin数据库 mongo -uroot –proot 127.0.0.1/admin --进入app库删除app用户 use app db.dropUser("app")
建立app数据库的管理员:先登陆到admin数据库
use app db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "dbAdmin", db: "app" } ] } )
建立app数据库读写权限的用户并具备clusterAdmin权限:
use app db.createUser( { user: "app04", pwd: "app04", roles: [ { role: "readWrite", db: "app" }, { role: "clusterAdmin", db: "admin" } ] } )
mongoimport命令能够把一个特定格式文件中的内容导入到指定的collection中。该工具能够导入JSON格式数据,也能够导入CSV格式的数据。
mongoexport命令能够把一个collection导出成JSON格式或CSV格式的文件。能够经过参数指定导出的数据项,也能够根据指定的条件导出数据。
参数说明:
for(var i=1;i<=100;i++) db.info.insert({"id":i,"name":"jack"+i}) //循环写入100条数据 mongoexport -d school -c info -o /opt/info.json //导出 mongoimport -d school -c info1 --file /opt/info.json //导入到info集合 mongoexport -d school -c info1 -q '{"id":{"$eq":10}}' -o /opt/top10.json //条件导出指定第10行
备份:mongodump
恢复:mongorestore
参数说明:
mkdir /backup --建立存放目录 mongodump -d abc -o /backup/ --备份abc数据库 mongorestore -d abc123 --dir=/backup/abc --恢复到abc123数据库
>db.copyDatabase("abc","abc1") --复制数据库abc生成abc1
SQL语言与CRUD语言对照
SQL Schema Statements |
MongoDB Schema Statements |
CREATE TABLE users ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) ) |
Implicitly created on first insert() operation. The primary key _idis automatically added if _id field is not specified. db.users.insert( { user_id: "abc123", age: 55, status: "A" } ) However, you can also explicitly create a collection: db.createCollection("users") |
ALTER TABLE users ADD join_date DATETIME |
在Collection 级没有数据结构概念。然而在 document级,能够经过$set在 update操做添加列到文档中。 db.users.update( { }, { $set: { join_date: new Date() } }, { multi: true } ) |
ALTER TABLE users DROP COLUMN join_date |
在Collection 级没有数据结构概念。然而在 document级,能够经过$unset 在update操做从文档中删除列。 db.users.update( { }, { $unset: { join_date: "" } }, { multi: true } ) |
CREATE INDEX idx_user_id_asc ON users(user_id) |
db.users.createIndex( { user_id: 1 } ) |
CREATE INDEX idx_user_id_asc_age_desc ON users(user_id, age DESC) |
db.users.createIndex( { user_id: 1, age: -1 } ) |
DROP TABLE users |
db.users.drop() |
插入/删除/更新 语句对比
SQL Statements |
MongoDB Statements |
INSERT INTO users(user_id, age status) VALUES ("bcd001", 45, "A") |
db.users.insert( { user_id: "bcd001", age: 45, status: "A" } ) |
DELETE FROM users WHERE status = "D" |
db.users.remove( { status: "D" } ) |
DELETE FROM users |
db.users.remove({}) |
UPDATE users SET status = "C" WHERE age > 25 |
db.users.update( { age: { $gt: 25 } }, { $set: { status: "C" } }, { multi: true } ) |
UPDATE users SET age = age + 3 WHERE status = "A" |
db.users.update( { status: "A" } , { $inc: { age: 3 } }, { multi: true } ) |
查询类操做对比
SQL SELECT Statements |
MongoDB find() Statements |
SELECT * FROM users |
db.users.find() |
SELECT id, user_id, status FROM users |
db.users.find( { }, { user_id: 1, status: 1, _id: 0 } ) |
SELECT user_id, status FROM users |
db.users.find( { }, { user_id: 1, status: 1 } ) |
SELECT * FROM users WHERE status = "A" |
db.users.find( { status: "A" } ) |
SELECT user_id, status FROM users WHERE status = "A" |
db.users.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } ) |
--在登录数据库的时候,发现会由描述文件相关的报错。 [mongod@MongoDB mongodb]$ mongo MongoDB shell version: 3.2.8 connecting to: test Server has startup warnings: 2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten] 2018-01-03T11:08:55.526+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 19193 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files. --解决办法: cat >> /etc/security/limits.conf <<EOF mongod soft nofile 32767.5 mongod soft nproc 32767.5 EOF --修改后,重启服务器,便可解决该问题。
整理自:https://www.cnblogs.com/clsn/p/8214194.html#auto_id_2一、https://blog.51cto.com/13625810/214748一、https://www.cnblogs.com/luotianshuai/p/5583439.html