MongoDB 是什么?
是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
学习网站
https://www.runoob.com/mongodb/mongodb-tutorial.html
使用范围和限制
缺点:不支持连表查询,不支持sql语句,不支持食物存储过程等,所以不适合存储数据见关系比较复杂的数据,一般当做数据仓库来使用。
适用于:日志系统,股票数据等(***数据仓库***)
不适用于:电子商务系统等需要连表查询的系统
基本概念
文档:是MongoDB中数据的基本单元,类似关系数据库中的行,例如:下列的每一行就是一个文档,并且属于不同文档
{"username":"Tom","age":21}
{"UserName":"Tom","age":"21"}
注意:
区分大小写数据类型;
每一个文档尺寸不能超过16M;
集合:多个文档组成一个集合,类似于关系数据库的表
无模式:同一个集合中可以包含不格式的文档;
模式自由:集合中没有行和列的概念;
注意:集合不用预先创建,没有结构。
数据库:多个集合组成数据库,同关系数据库中数据库
注意:MongoDB中的数据库无需创建
安装
官网下载地址:https://www.mongodb.com/download-center/community
创建数据库
语法:use 数据库名称
注意:数据库不存在,则会创建,存在,则切换,如果创建了数据库,没有任何操作,则会自动删除数据库。
查看数据库
语法:show dbs
创建集合
向集合中插入文档的语法:db.集合名.insert({})
例如:db.person.insert({'name':'Tom'})
注意:MongoDB中的集合无需创建,直接使用
查看集合
语法:show tables
查询集合中的文档
语法:
db.集合名.find() 查询所有
db.集合名.findOne() 查询第一个文档
删除集合
语法:db.集合名.drop()
删除数据库
语法:db.dropDatabase()
帮助命令
全局帮助:help
数据库相关的帮助:db.help()
集合相关的帮助:db.集合名.help()
添加文档
语法:db.person.insert({key:value})
注意:文档就是键值对,数据类型是BSON格式,支持的格式更丰富。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
每个文档都有一个'_id'字段,表示主键,可以是任意类型,默认是ObjectId对象,可以自己指定,不能重复,插入重复的值,则会报错。
可以使用js代码批量插入,例如:
for(var i=1;i<10;i++){
db.user.insert({_id:i,name:'tom_'+i});
}
删除文档
语法:db.集合名.remove({条件})
不写条件表示删除所有文档
例如:删除user集合中name等于tom的文档
db.user.remove({name:'tom'})
条件判断可以使用操作符实现,常用操作符如下:
$lt <, $lte <=, $gt >, $gte >=,$ne !=,$in, $nin, $or, $not
$mod(取模), $exits, $where
例如:删除年龄大于5的文档
db.user.remove({age:{'$gt':7}})
更新文档
直接修改
会完全替换文档
语法:
db.集合名.update({条件},{新文档})
db.集合名.update(条件,新文档,是否新增,是否修改多条)
是否新增:值是1(true),满足条件的则新增
是否修改记录:值是1(true),如果满足条件的有多条文档则都要修改
使用修改器
可以指定修改某个键
常用修改器:
$inc:加一个数字
$set:修改某个字段,如果该字段不存在,则添加
语法:db.集合名.update({条件},{修改器名词:{修改的键:修改的值}})
例如:
修改age=3的文档的name为xiaotian,并且其它键值不丢失
db.user.update({age:3},{"$set":{name:"xiaotian"}})
修改name=xiaotian的age添加10岁
db.user.update({name:xiaotian},{"$inc":{age:10}})
查询文档
语法:
db.集合名.find({条件})
例如:
取出user集合中第一个
db.user.findOne()
取出user集合中age=2的
db.user.find({age:2})
取出user集合中age>2的
db.user.find({age:{"$gt":2}})
取出user集合中的文档,只显示name键
db.user.find({},{age:1}) 1表示只显示age键
db.user.find({},{age:0}) 0表示显示除了age以外的所有键
注意:_id 键默认返回,需要主动指定 _id:0 才会隐藏
根据age的降序或者升序来显示文档
db.user.find().sort({age:1}) 1表示升序
db.user.find().sort({age:-11}) -1表示降序
显示user集合的前3个文档
db.user.find().limit(3)
显示user集合的第3个到第5个文档
db.user.find().skip(2).limit(3)
显示age=3或者name=xiaotian的文档
db.user.find({$or:[{age:3},{name:"xiaotian"}]})
查询 title 包含"教"字的文档:
db.user.find({title:/教/})
查询 title 字段以"教"字开头的文档:
db.user.find({title:/^教/})
查询 title 字段以"教"字结尾的文档:
db.user.find({title:/教$/})
统计user集合中文档的个数
db.user.count()
用户管理
在MongoDB中,用户属于数据库,每个用户有自己的管理员,管理员登录后,只能操作所属的数据库
注意:在admin数据库中创建的用户是超级管理员,登陆后可以操作任何的数据库
创建用户
步骤:
1,选择数据库:use 数据库名
2,添加用户:db.addUser(用户名,密码,是否只读)
是否只读:默认为false,如果 为true,则用户只能查询
注意:在创建管理员之前必须创建超级管理员
创建的用户名和密码是存储在各自数据库中的system.user集合中
验证权限
语法:db.auth(用户名,密码)
删除用户
直接删除system.user集合中的文档即可
普通单列索引
语法:db.集合名.ensureIndex({键名:1}) 1是正序,-1是倒序
多列索引(复合索引)
语法:db.集合名.ensureIndex({键名:1,键名:1})
查看索引
查看当前的索引
语法:db.集合名.getIndexes()
查看本次查询语句使用的哪个索引
语法:db.集合名.find().explain()
子文档索引
语法:db.集合名.ensureIndex({filed.subfield:1})
例如:如下的文档
{name:'洛基亚',price:12.34,spc:{weight:100,area:'纽约'}}
可以建立如下索引:
db.net.ensureIndex({spc.weight:1})
唯一索引
语法:db.集合名.ensureIndex({filed:1},{unique:true})
删除索引
删除单个
db.集合名.dropIndex({filed:1})
删除所有
db.集合名.dropIndexes()
重建索引
一个表通过多次修改后,导致表的文件产生空洞,可以通过重建索引,减少文件碎片,并提高索引的效率。
类似mysql的optimize table
语法:db.集合名.reIndex()
索引使用注意事项
1,索引能提高查询性能,但同时会影响插入性能,所以对于经常查询少插入的文档可以考虑使用索引
导出和导入数据
导出
命令:mongoexport
-h host主机
--port 端口
-d 使用的库
-c 导出的集合
-o 导出的文件
--cvs 指定导出的csv格式
-q 过滤导出
-f field1 field2 指定导出的列
-u username 超级管理员用户名
-p password 超级管理员密码
导入
命令:mongoimport
-d 待导入的数据库
-c 待导入的集合
--type csv/json 导入数据的类型,默认json
--file 备份文件路径
主从复制
是一个简单的数据库同步备份的集群技术
至少两台数据库服务器,可以分别设置主服务器和从服务器,对主服务器的任务操作都会同步到从服务器。
注意:
1,主服务器只能有一台
2,--master 用来确定主服务器, --slave 和 --source 来控制从服务器