NoSQL-MongoDB基础

MongDB概述

MongoDB是用C++编写的非关系型数据库,特点是性能高、易部署、易使用,存储数据灵活。

MongoDB的主要特性如下:

①面向集合存储

②支持动态查询

③支持完全索引,包括内部对象

④支持主从复制和故障恢复

⑤高效存储二进制数据(BSON)

基本概念

·集合:collection,集合由一组文档组成,类似于关系型数据库中的表。

·文档:document,文档用于存储一组数据,类似于关系型数据库中的行。

·MongoDB的一个实例支持创建多个数据库,每个数据库都有自己独立的集合和权限。

·MongoDB自带JavaScript Shell,功能十分强大。

·每一个document中都有一个特殊的key-“_id”,它在一个集合中是唯一的,相当于关系型数据库中的主键。


MongoDB的下载与安装

到MongoDB官网即可下载最新版本:https://www.mongodb.org/


然后将下载的压缩包解压到本地文件夹中,并将其bin目录添加到环境变量(Path)中,方便操作。

添加环境变量略。

然后在dos中输入mongo,测试是否安装成功

NoSQL-MongoDB基础_第1张图片

第一行为当前MongoDB的版本,同时,我们也可以看出MongoDB的默认服务端口为27017。

安装完成。


MongoDB的常规操作

启动MongoDB实例

1.在本地创建一个目录,用于存储数据,例如 F:\mongodbtemp\test

2.启动一个实例 mongod -dbpath=f:/mongodbtemp/test

NoSQL-MongoDB基础_第2张图片

此时,test目录中多处了一些文件和文件夹,test文件夹就被作为一个MongoDB的数据存储空间

NoSQL-MongoDB基础_第3张图片


通过web页面访问MongoDB控制台

闭嘴没有Google相关资料,也不知道具体原因,照做就是了

NoSQL-MongoDB基础_第4张图片

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();

              NoSQL-MongoDB基础_第5张图片

查看当前数据库的所有集合

show tables;    或

show collections;

创建集合

显示创建

db.createCollection("集合名称");

NoSQL-MongoDB基础_第6张图片


隐式创建

执行db操作,如果该集合没有就会自动创建

删除集合

db.集合名称.drop();



MongoDB的数据操作

插入并查询一条记录

insert({json});

find();

NoSQL-MongoDB基础_第7张图片


批量插入记录(利用JavaScript Shell)

NoSQL-MongoDB基础_第8张图片


删除数据

按条件删除

db.collection.remove({json条件});

NoSQL-MongoDB基础_第9张图片

删除集合冲的全部数据

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

NoSQL-MongoDB基础_第10张图片

大家可能注意到了,原来的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,则什么都不做。

MongoDB的数据查询

find()和findOne()

查询name=lisi并且address=xierqi的记录


find与findOne的对比

NoSQL-MongoDB基础_第11张图片

投影查询

查询所有记录,但忽略age属性

NoSQL-MongoDB基础_第12张图片

查询所有记录,但只要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岁的文档并且namename5的文档

db.user.find({age:{$gt:3,$lt:6},name:'name5'})

统计查询

统计(count)、排序(sort)、分页(skiplimit)

统计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

查询爱好javaeat的文档

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}})


MongoDB中的游标

var x = db.c1.find();   //得到数据

x.next();     //获取下一条记录

x.hasNext();    //判断是否还有记录

NoSQL-MongoDB基础_第13张图片


MongoDB中的索引

默认索引

每一个document在创建的时候都有一个默认key-_id,该列的值在当前集合中是唯一的,该列默认存在索引


索引有无索引查询对比

向数据库中插入50万个document,并分析查询时间

NoSQL-MongoDB基础_第14张图片

显然,此次查询用了279毫秒

利用ensureIndex创建索引后在此分析

NoSQL-MongoDB基础_第15张图片

此次查询用了6millis,很显然,快的不是一星半点。


删除索引

dropIndex();


你可能感兴趣的:(NoSQL-MongoDB基础)