MongoDB是用C++编写的非关系型数据库,特点是性能高、易部署、易使用,存储数据灵活。
MongoDB的主要特性如下:
①面向集合存储
②支持动态查询
③支持完全索引,包括内部对象
④支持主从复制和故障恢复
⑤高效存储二进制数据(BSON)
·集合:collection,集合由一组文档组成,类似于关系型数据库中的表。
·文档:document,文档用于存储一组数据,类似于关系型数据库中的行。
·MongoDB的一个实例支持创建多个数据库,每个数据库都有自己独立的集合和权限。
·MongoDB自带JavaScript Shell,功能十分强大。
·每一个document中都有一个特殊的key-“_id”,它在一个集合中是唯一的,相当于关系型数据库中的主键。
到MongoDB官网即可下载最新版本:https://www.mongodb.org/
然后将下载的压缩包解压到本地文件夹中,并将其bin目录添加到环境变量(Path)中,方便操作。
添加环境变量略。
然后在dos中输入mongo,测试是否安装成功
第一行为当前MongoDB的版本,同时,我们也可以看出MongoDB的默认服务端口为27017。
安装完成。
启动MongoDB实例
1.在本地创建一个目录,用于存储数据,例如 F:\mongodbtemp\test
2.启动一个实例 mongod -dbpath=f:/mongodbtemp/test
此时,test目录中多处了一些文件和文件夹,test文件夹就被作为一个MongoDB的数据存储空间
通过web页面访问MongoDB控制台
没有Google相关资料,也不知道具体原因,照做就是了
OK,MongoDB实例启动成功。
把MongoDB添加到windows系统服务
如果嫌每次都需要手动启动MongoDB实例,可以将其添加到系统服务,使用时会更方便。
添加服务:mongod.exe --logpath E:\mongo_log\mongodb.log --logappend --dbpath E:\mongo_data --directoryperdb --serviceName MongoDB --install
移除服务
SC delete MongoDB
n mongod.exe --logpath E:\mongo_log\mongodb.log --logappend --dbpath E:\mongo_data --directoryperdb --serviceName MongoDB --remove
连接MongoDB数据库
mongo ip_address:port
创建数据库
use db_name (没有则创建)
显示所有数据库
show dbs;
查看当前数据库
db
删除当前数据库
db.dropDatabase();
查看数据库的所有操作方法
db.help();
查看当前数据库的所有集合
show tables; 或
show collections;
创建集合
显示创建
db.createCollection("集合名称");
隐式创建
执行db操作,如果该集合没有就会自动创建
删除集合
db.集合名称.drop();
插入并查询一条记录
insert({json});
find();
批量插入记录(利用JavaScript Shell)
删除数据
按条件删除
db.collection.remove({json条件});
删除集合冲的全部数据
db.collection.remove();
更新数据
更新数据相对来说比较复杂,因为更新语句中有多个参数,下面对更新操作做详细说明
db.集合名称.update( query , obj , upsert , multi)
query:用来设置查询条件,相当于sql中的where语句obj:设置更新的内容,即被改为的数据
upsert:该值取值为0或1,
0:如果按照条件查询不到,则不会像数据库中插入一条新记录。
1:如果按照条件查询不到,则会想数据库中插入一条记录。
multi:如果又多个符合条件的记录是否全部更新,如果是0,只更新第一条,如果是1,更新全部,
默认值是0,。
常用形式:db.集合名称.update(查询条件,新的取值,0,1);
eg:
将name=zhangsan的记录更新为name=lisi
大家可能注意到了,原来的age属性没了。
更新集合中的文档, $set 用来指定一个键的值,如果这个键不存在,则创建
db.c2.update({name:'zhangsan'},{$set:{address:'xierqi'}},0,1);
利用$set 就不会出现上的原始值别覆盖的情况了。
修改上述address属性的值
增加或减少集合中的某个键对应的值,$inc
给name=zhangsan的age属性加1
利用$unset来删除某个键值
删除name=zhangsan的address属性
db.c2.update({name:'zhangsan'},{$unset:{address:1}},0,1);
其中,如果addres的值为1,则表示将该属性删除,如果为0,则什么都不做。
find()和findOne()
查询name=lisi并且address=xierqi的记录
find与findOne的对比
投影查询
查询所有记录,但忽略age属性
查询所有记录,但只要name属性
查询name=lisi的name和age birthday字段,不显示age
条件查询
db.集合名称.find({字段名:{$gt/$lt/$gte/$lte/$ne:值}})
大于$gt
小于$lt
大于等于$gte
小于等于$lte
不等于$ne
查询年龄大于5周岁的文档
db.user.find({age:{$gt:5}})
查询年龄大于3岁并且小于6岁的文档
db.user.find({age:{$gt:3,$lt:6}})
查询年龄大于3岁并且小于6岁的文档并且name为name5的文档
db.user.find({age:{$gt:3,$lt:6},name:'name5'})
统计查询
统计(count)、排序(sort)、分页(skip、limit)
统计user集合中的文档数量
db.user.count()
按照年龄进行升序查询
db.user.find().sort({age:1})
照年龄进行降序查询
db.user.find().sort({age:-1})
查询前5条记录(skip指忽略的条数,limit指查询的条数)
db.user.find().skip(0).limit(5)
从第3条开始(即忽略2条),查询6条记录
db.user.find().skip(2).limit(6)
从第3条开始(即忽略2条),查询6条记录,并打印查询结果数量
db.user.find().skip(2).limit(6).count(1)
值为数组的查询
插入一条带数组属性的记录
$all $in $nin $or $exists
查询爱好java和eat的文档
db.student.find({hobby:{$all:['java','eat']}});
查询爱好编程的学员
db.student.find({hobby:{$in:['java','net','php']}})
查询不爱好编程的学员
db.student.find({hobby:{$nin:['java','net','php']}})
查询user集合中name=name10的或者age=8的
db.user.find({$or:[{name:'name10'},{age:8}]})
查询有name键值的文档
db.user.find({age:{$exists:1}})
查询没有name键值的文档
db.user.find({age:{$exists:0}})
var x = db.c1.find(); //得到数据
x.next(); //获取下一条记录
x.hasNext(); //判断是否还有记录
默认索引
每一个document在创建的时候都有一个默认key-_id,该列的值在当前集合中是唯一的,该列默认存在索引
索引有无索引查询对比
向数据库中插入50万个document,并分析查询时间
显然,此次查询用了279毫秒
利用ensureIndex创建索引后在此分析
此次查询用了6millis,很显然,快的不是一星半点。
删除索引
dropIndex();