Linux环境下,MongoDB库和集合的操作,增删改查的基本使用,游标的操作以及索引的基本使用

一、MongoDB数据库简介

MongoDB,是NoSQL数据库,是一个基于分布式文档存储的开源数据库系统,旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

二、MongoDB数据库对比MySQL数据库的概念

MySQL数据库概念MongoDB数据库概念解释
databasedatabase数据库
tablecollection前者:数据库表,后者:集合
rowdocument前者:行,后者:文档
columnfield前者:列,后者:域
indexindex索引
table joins前者:表连接,后者:不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

三、MongoDB数据库的库和集合操作

3.1 查看数据库列表
show dbs;

查看数据库

3.2 创建数据库
use testdb;

创建数据库

这时,使用show dbs;并没有看到创建的testdb数据库,但通过返回的switched to db testdb,说明已经切换到创建的数据库了,这是由于MongoDB是隐式创建数据库,当使用use 数据库名称时,就已经创建数据库了。

想要通过show dbs;,显式的查看创建出的数据库,则需要在创建的数据库下创建表

3.3 删除数据库
db.dropDatabase();

删除当前所在的数据库。

3.4 创建集合
db.createCollection("user");

创建表

当使用db.createCollection("集合名");命令创建集合之后,再使用show dbs;命令查看数据库,则可以看到数据库也显示出来了。

3.5 查看集合列表
show collections;

查看数据表

3.6 删除集合
db.user.drop();

使用db.表名.drop();命令,删除指定集合。

删除表

四、MongoDB数据库增删改查的基本使用

4.1 增操作----insert

Mongodb存储的是文档,文档是json格式的对象。

(1)插入一条数据

db.user.insert({name:'qianye',age:25,programe:'java'}); 

插入一条数据

通过db.user.find();命令,可以查user集合里的所有数据,可以看到除了插入的数据,MongoDB数据库自动随机生成_id

当然也可以自己指定_id值,例如:

db.user.insert({_id:1,name:'xiaoyi',age:24,programe:'java'}); 

插入指定id数据
(2)插入多条数据

db.user.insert([{_id:2,name:'xiaoer',age:27,programe:'php'},{_id:3,name:'xiaosan',age:27,programe:'go'},{_id:4,name:'xiaosi',age:28,programe:'c'}]);

插入多条数据
(3)定义变量插入数据

可以将需要插入的数据,定义成一个变量,然后执行db.集合名.insert(变量名);

document=({_id:5,name:'xiaowu',age:25,programe:'c++'});
db.user.insert(document);

变量插入

4.2 删操作----remove

(1)删除一条数据

db.user.remove({name:'qianye'},true); 

或者

db.user.remove({name:'qianye'},1); 

删除操作,第二个可选参数指定为true或指定为1时,会将文档中包含指定条件的第一条数据删除。即使有多个包含指定条件的数据,也只会删除第一条数据。

删除一条数据
(2)删除多条数据

db.user.remove({name:'qianye'}); 

或者

db.user.remove({name:'qianye'},0); 

删除操作,第二个可选参数不选或指定为0时,会将文档中包含指定条件的数据都删除。

在这里插入图片描述
(3)删除当前collection下所有文档

db.user.remove({});
4.3 改操作----update

db.集合名.update(查询表达式,新值,可选参数选项);

(1)替换文档操作

db.user.update({name:'xiaoyi'},{name:'xiaoliu'});

注意:这是新文档替换了旧文档

文档替换
(2)指定修改

使用$set操作符,用指定的值替换字段的值。

db.user.update({name:'xiaoyi'},{$set:{age:25}});

指定修改
(3)删除特定字段

使用$unset操作符,删除特定字段。

db.user.update({name:'xiaoliu'},{$unset:{test:1}});

删除特定字段
(4)更新字段名

使用$rename操作符,更新字段名。

db.user.update({name:'xiaoqi'},{$rename:{year:'age'}}); 

更新字段
(5)字段递增指定的值

使用$inc操作符,将字段递增指定的值。

db.user.update({name:'xiaoqi'},{$inc:{age:2}});

字段递增
(6)当发生update修改操作并有insert插入操作时,进行补充字段操作。

如果upsert: trueupdate操作导致插入文档,那么$setOnInsert将指定的值分配给文档中的字段。如果更新操作没有导致插入,则$setOnInsert不执行任何操作。

db.user.update({name:'xiaoba'},{$set:{name:'xiaojiu'},$setOnInsert:{age:24,programe:'go'}},{upsert:true});

插入补充字段

对于upsert:true可选项,是当修改操作指定时,如果没有匹配的行,则直接插入该行(true或者1)。

db.user.update({name:'xiaoba'},{$set:{name:'xiaoshi'}},{upsert:true});

upsert
(7)更新多个文档

可选项,如果multi设置为true, 将更新满足查询条件标准的所有文档。

db.user.update({age:27},{$set:{age:26}},{multi:true});

multi

4.4 查操作----find

(1)查询所有文档

db.user.find();

(2)查询有多少文档

db.user.find().count();

(3)查询所有文档的某个字段

db.user.find({},{name:1});

查询所有文档的某个字段

默认会将_id字段查询出来

(4)查询所有文档age字段为26的name字段且不带_id属性

db.user.find({age:26},{name:1,_id:0});

查询4
(5)查询所有文档age字段不等于26的,且只显示age字段,name字段,不显示_id字段

$ne选择字段值不等于指定值的文档。这包括不包含字段的文档。

db.user.find({age:{$ne:26}},{age:1,name:1,_id:0});

查询5
(6)查询所有文档age字段大于26的,且只显示age字段,name字段,不显示_id字段

$gt选择字段值大于(即>)指定值的文档。

db.user.find({age:{$gt:26}},{age:1,name:1,_id:0});

查询6
(7)查询所有文档age字段大于等于26的,且只显示age字段,name字段,不显示_id字段

$gte选择字段值大于或等于指定值(例如,>=)的文档。

db.user.find({age:{$gte:26}},{age:1,name:1,_id:0});

查询7
(8)查询所有文档age字段小于26的,且只显示age字段,name字段,不显示_id字段

$lt选择字段值小于(即<)指定值的文档。

db.user.find({age:{$lt:26}},{age:1,name:1,_id:0});

查询8
(9)查询所有文档age字段小于等于26的,且只显示age字段,name字段,不显示_id字段

$lte选择字段值小于或等于(即<=)指定值的文档。

db.user.find({age:{$lte:26}},{age:1,name:1,_id:0});

查询9
(10)查询文档age字段大于等于25 且 小于等于28的,且只显示name字段,age字段,不显示_id字段

$and对包含两个或多个表达式的数组执行逻辑和操作(例如<表达式1><表达式2>,等等),并选择满足数组中所有表达式的文档。$and操作符使用短路评估。如果第一个表达式(例如<表达式1>)的值为false, MongoDB将不计算其余表达式的值。

db.user.find({$and:[{age:{$gte:25}},{age:{$lte:28}}]},{name:1,age:1,_id:0}); 

查询10
(11)查询文档age字段大于等于25 或 小于等于28的,且只显示name字段,age字段,不显示_id字段

$or操作符对两个或多个<表达式>组成的数组执行逻辑或操作,并选择满足至少一个<表达式>的文档。

db.user.find({$or:[{age:{$gte:25}},{age:{$lte:28}}]},{name:1,age:1,_id:0}); 

查询11
(12)查询文档age字段包含24和26的,且只显示name字段,age字段,不显示是_id字段

$in操作符选择字段的值等于指定数组中的任何值的文档。

db.user.find({age:{$in:[24,26]}},{name:1,age:1,_id:0});

查询12
(13)查询文档age字段不包含24和26的,且只显示name字段,age字段,不显示是_id字段

$nin选择以下文档:字段值不在指定数组中或字段不存在。

db.user.find({age:{$nin:[24,26]}},{name:1,age:1,_id:0});

查询13
(14)查询文档age字段不包含24和26的,且只显示name字段,age字段,不显示是_id字段

$nor对一个或多个查询表达式的数组执行逻辑或操作,并选择数组中所有查询表达式都失败的文档。

db.user.find({$nor:[{age:24},{age:26}]},{name:1,age:1,_id:0});

查询14
(15)查询文档age字段除以5余数为0的,且只显示name字段,age字段,不显示_id字段

$mod求余,选择一个字段除以一个除数的值有指定余数的文档(即执行一个模数操作来选择文档)。

db.user.find({$nor:[{age:24},{age:26}]},{name:1,age:1,_id:0});

查询15
(16)查询文档含有age字段值的

<boolean>true时,$exists匹配包含该字段的文档,包括字段值为null的文档。如果<boolean>false,则查询只返回不包含该字段的文档。

db.user.find({age:{$exists:true}});

查询16
(17)查询文档age的值是Double类型的

$type选择字段值为指定BSON类型实例的文档。在处理数据类型不可预测的高度非结构化数据时,按数据类型查询非常有用。

db.user.find({age:{$type:1}});

查询17

常见的类型所对应的数值

类型对应的数值
(18)查询文档age大于25的

使用$where操作符将包含JavaScript表达式的字符串或完整的JavaScript函数传递给查询系统。$where提供了更大的灵活性,但要求数据库处理集合中每个文档的JavaScript表达式或函数。使用this或obj在JavaScript表达式或函数中引用文档。

db.user.find({$where:'this.age>25'});

查询18

注意:当由where操作时,会将逐一遍历mongo集合中文档对象,将其属性由Bson格式转换为Json。然后能通过json找到对象属性,供js来调用,查询效率会比较低。但能写出比较复杂的操作语句,能使的表达式写的比较容易。

(19)子文档查询

db.user.find({'spc.area':'taiwan'});

子文档查询

五、MongoDB数据库的游标操作

5.1 什么是游标----cursor

游标不是查询结果,可以理解为数据在遍历过程中的内部指针,其返回的是一个资源,或者说数据读取接口。

5.2 游标的基本使用

(1)声明游标

var cursor = db.user.find({_id:{$gt:4}});

(2)判断游标是否已经取到尽头

cursor.hasNext();

(3)取出游标的下1个单元(从0开始游)

cursor.next();
5.3 使用while循环游标
var cursor = db.user.find({_id:{$gt:4}});
while (cursor.hasNext()) {
	printjson(cursor.next());
};

while循环游标

注意:print打印的是二进制对象,printjson打印出来的才是可阅读的json格式数据。

5.4 使用forEach循环游标
var cursor = db.user.find({_id:{$gt:4}});
cursor.forEach(function(obj){printjson(obj)});

forEach循环游标

obj就是查出的文档对象

取出_id的值:

var cursor = db.user.find({_id:{$gt:4}});
cursor.forEach(function(obj){printjson(obj._id)});

取出id

5.5 游标在分页中的使用

(1)查询结果,跳过前100行

var cursor = db.user.find().skip(100);
cursor.forEach(function(obj){printjson(obj)});

分页skip
(2)查询第11页,每页5条数据

var cursor = db.user.find().skip(50).limit(5);
cursor.forEach(function(obj){printjson(obj)});

分页skip-limit

如果不使用游标:

不使用游标
(3)查询第11页,每页5条,第二行的数据

var cursor = db.user.find().skip(50).limit(5);
printjson(cursor.toArray()[2]);

toArray

printjson(cursor.toArray()); ---- 看到所有行

注意:不要随意使用toArray()
原因:会把所有的行立即以对象形式组织在内存里。可以在取出少数几行时,用此功能。

六、MongoDB数据库索引的使用

6.1 查看查询计划
db.user.find({age:4}).explain(); 

查询计划

6.2 添加索引

(1)在name字段上,添加索引

db.user.ensureIndex({name:1});

这里的1表示索引创建的方向,可以取值为1和-1。

添加索引
(2)添加多列索引

db.user.ensureIndex({'name':1,'age':1});

多列索引
(3)添加唯一索引

db.user.ensureIndex({'name':1},{unique:true});

唯一索引
(4)添加子文档索引

db.user.ensureIndex({'spc.area':1});

子文档索引

6.3 查看索引
db.user.getIndexes();

查看索引

6.4 删除索引

(1)删除指定的索引

db.user.dropIndex({'name':1});

(2)删除所有的索引

db.user.dropIndexes();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值