MongoDB数据库简介及基础操作
1)简介
MongoDB是用c++写的非关系型数据库,特点是高性能、易部署、易使用,存储数据非常方便,面向集合存储,易于存储对象类型的数据,模式自由,支持动态查询,支持完全索引,包含内部对象,支持复制和故障恢复,使用高效的二进制数据存储,包括大型对象,文件存储格式为BSON(一种json的扩展)。
MongoDB的体系结构:
文档(Document),集合(Collection),数据库(datebase)。
文档相当于关系数据库中的一行记录;集合相当于关系数据库中表的概念;
MySQL数据库和MongoDB数据库语句的比较参考文档:
https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/
2)库和集合的命名规则
库名命名规则:
- 不能是空字符串(”“)。
- 不得含有’ ‘(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config:
集合命名规则:
- 集合名不能是空字符串”“。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以”system.”开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
db.createCollection(“集合名” ,{capped:true, size:100000}) : 创建集合
3)创建库
use+库名,若库名不存在,则自动创建数据库。
Show dbs : 查看所有的数据库。没看到我刚刚创建的数据库,怎么回事儿呢?加个数据 试试看,之后再执行命令,就能看到了
MongoDB中默认的数据库时test,如果没建新的数据库,集合将放在test中。
4)删除库
db.dropDatabase() : 删除当前的数据库。
db.dropDatabase() 严格区分大小写的,不然会报错,
{ “dropped” : “runoob”, “ok” : 1 }
db.collection.drop() : 删除集合
假设现在users集合数据量特别大,但是需要清空该集合,推荐使用db.users.drop(),而不是使用db.users.remove({})。使用drop方法后,再重新创建集合并创建索引。优点是速度快。原因是:remove删除是需要进行一个全盘查询操作的,而drop操作不需要。
5)插入数据
- 1
插入的数据均是键值对形式。使用db.col.find()命令可以查到此数据。
6)更新文档(update()方法)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入 objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数 为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
7)删除文档
db.COLLECTION_NAME.remove(DELETION_CRITERIA,1) 删除一条记录
db.col.remove({ ‘ ’ : ‘ ’ }) 根据键值对删除记录
db.col.remove({}) 删除所有记录
8)查询文档
MongoDB 查询数据的语法格式如下:
b.collection.find(query, projection)
query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有 键值, 只需省略该参数即可(默认省略)。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.col.find().pretty() pretty() 方法以格式化的方式来显示所有文档。
9)关系运算
10)limit和skip
limit和skip用法与SQL类似,不记录
当查询同时使用sort,skip,limit,无论位置先后,最先sort,再skip,再limit。
db.col.find({},{“title”:1,_id:0}).limit(2)
第一个{}放where条件,为空则表示返回集合中所有文档。
第二个{}指定列是否显示,0是不显示,1是显示。只会返回写出来的属性。
11)排序sort()
db.COLLECTION_NAME.find().sort({KEY:1}) 1为升序,-1为降序。
db.col.find({},{“title”:1,_id:0}).sort({“likes”:-1})
12)索引
1、创建索引的语法:
db.COLLECTION_NAME.ensureIndex({KEY:1})
语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
2、查询索引:
使用db.集合名.getIndexes()实现查询
使用db.system.indexes.find()可查询全部索引
3、删除索引:
指定索引名称删除:db.集合名.dropIndex(name)
删除指定集合的全部索引:db.集合名.dropIndexes()
4、索引重建:
使用集合的reIndex()方法进行索引的重建。
在文档中直接更改索引值即可。
13)集合的操作
创建集合
db.createCollection(name, { size : …, capped : …, max : … })
示例:
查看所有集合\表
show collections
show tables
选定某一集合
use collection_name
查看集合的信息
db.stats()
删除一个集合,但是需要先指定一个数据库,即先执行 use db_name
db.dropDatabase()
修改集合的名称
db.collection_name.renameCollection(‘new_name’)
删除集合:也可以执行db.集合名.drop()
14)其他命令
- Net start MongoDB : 启动服务
- Net stop MongoDB : 停止服务
- Exit 或 Ctrl+C退出MongoDBshell
- 查询指定数据库统计信息:db.stats()
- 查询指定数据库包含的集合名称列表:db.getCollectionNames()
- 查询并统计结果记录数:
use 要统计的库名
db.baseSe.find().count() - 查询指定数据库集合的可用空间:
db.集合名.storageSize() - 查询指定数据库的集合的存储空间
db.集合名.totalSize() - 终止服务器进程:db.shutdownServer()