MongoDB系列---集合与文档操做03

MongoDB-——Collection


 

学习大纲:

  一、集合操做

  二、文档操做  


 

 

知识回顾:

  上一篇咱们讲述了如何对MongoDB的权限和用户进行平常的基本操做,来达到咱们对数据库的基本安全保障。java

 


 

 

一 MongoDB的集合操做


 

 

前言:

  MongoDB中的集合是一组文档的集,至关于关系型数据库中的表。linux

1 建立集合

  MongoDB使用db.createCollection()函数来建立集合。spring

语法格式:db.createCollection(name,options)
name:要建立的集合名称
options:可选参数,指定有关内存大小及索引的选项

options 能够是以下参数

 

 

   在插入文档时,MongoDB首先检查固定集合的size字段,而后检查max字段

 

1.1 使用默认集合

  在MongoDB中,咱们能够不用建立集合,当咱们插入一些数据时,会自动建立集合,而且会使用文档管理命令中的集合名称做为集合的名称。文档管理命令后续会详细讲解。

  建立一个新数据库,名为day(名称本身随意)sql

 

 

若是开启认证,须要为数据库建立访问用户。mongodb

新建 用户名为day,密码也为day  权限为writeDay  数据库为day(这里边用到了前边的知识,用户管理等。须要注意的是,建立用户咱们须要使用具备userAdminAnyDatabase权限的用户,也就是咱们前一博文建立的test,或者本身有相应权限的帐户均可以。)

 

 

咱们使用这个day用户登陆day数据库(最好把客户端关闭,在从新启动登陆,不然可能会出现问题!),并向库中插入一条测试数据库

 

 

查询集合

 这时候咱们发现,多出了一个集合,名字就为咱们的数据库名,由于上面说过,咱们没有手动建立集合的时候,并直接插入,它会使用默认的数据库的名字做为集合的名字生成一个集合,这时候刚刚插入的数据就在这个集合里面。shell

 

 


 

1.2 建立不带参数的集合

  咱们也能够根据本身的状况建立集合。在 day数据库中建立一个名为 day1 的集合,该集合建立时不指定任何参数。若是开启认证,则须要使用具备数据库管理员权限的用户来建立集合。数据库

 

 

1.3 建立带参数的集合

在 develop 数据库中建立一个名为 day2的固定集合,整个集合空间大小为 2000000kb(大约1.9g),文档最大个数为 1000数组

db.createCollection('day2',{capped:true,autoIndexId:true,size:2000000,max:1000})

 

 

 

 

 

 

2 查看集合

  若是要查看已有集合,可使用 show collections 或 show tables 命令。安全

2.1 show collections

 

2.2 show tables

 

 

 

 


 

 

二 文档操做


 

 

前言:

  在MongoDb中文档是指多个键及其关联的值有序地放置在一块儿就是文档,其实指的就是数据,也就是咱们平时操做最多的部分。数据结构

  MongoDB 中的文档的数据结构和 JSON 基本同样。全部存储在集合中的数据都BSON 格式。

  BSON 是一种相似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称

 

1 插入文档

1.1 插入单个文档

1.1.1 insert函数

语法格式:db.COLLECTION_NAME.insert(document)。

 

使用咱们的day用户来向day数据库里面的day集合添加一条数据并查看

db.day.insert({title:'day',tags:['java','BigData']})

db.day.find()

 

 

 

1.1.2 save函数

 使用咱们的day用户来向day数据库里面的day集合添加一条数据并查看

db.day.save({title:'day1',tags:['java1','BigData1']})

db.day.find()

 

 

1.1.3 insertOne函数

 在 MongoDB3.2 之后的版本中,提供了 insertOne()函数用于插入文档。向 day集合中插入单个文档。

 使用咱们的day用户来向day数据库里面的day集合添加一条数据并查看

db.day.insertOne({title:'day2',tags:['java2','BigData2']})

db.day.find()

    

 

 


 

 

1.2 插入多个文档

向集合中批量插入多个文档时候,须要使用数组来存放文档

语法格式:db.COLLECTION_NAME.insert([{},{},{}.....])

 

1.2.1 insert或save函数实现多文档插入

向day集合中批量插入多个文档

db.day.insert([{title:'arebirth',tags:['a','b','c']},{title:'arebirth1',tags:['spring','mvc','collection']}])

 

 

 查看文档

 

 

这里边的save就不演示了,跟inser操做语法同样,只是换一个函数名字而已。

 

 1.2.2 insertMany 函数

在 MongoDB3.2 之后的版本中,提供了 insertMany 函数用于插入文档

语法格式:db.COLLECTION_NAME.insertMany([{},{},{},.....])

 

向day集合中批量插入多个文档

db.day.insertMany([{title:'arebirth-many',tags:['a-many','b-many','c-many']},{title:'arebirth1-many',tags:['spring-many','mvc-many','collection-many']}])

 

 

 查看文档

 

 

 


 

 

1.3 经过变量插入文档

  Mongo Shell(也就是咱们如今操做MongoDB用的工具)工具容许咱们定义变量。全部的变量类型为var类型。也能够忽略变量类型。变量中的赋值符号后侧须要使用小括号来标识变量中的值。咱们能够将变量做为任意插入文档的函数的参数。

语法格式:变量名=({变量值})

 

1.3.1 经过变量插入单个文档

定义变量
document=({title:'SpringCloud',tags:['Spring Cloud Netflix','Spring Cloud Security','Spring Cloud Consul']})

 

 

插入文档

咱们如今将多个文档放入到了一个变量中,因此在插入数据时,可直接使用插入单个文 档的函数

 

 查询文档

 

1.3.2 经过变量插入多个文档

插入多个文档跟单个文档是同样的,区别只是咱们上边学习了若是要插入多个文档须要在文档外围加上中括号,数组包裹起来。

语法结构:变量名=([{},{},{},....])

这里就不演示了,动手本身测试下。

 

使用完变量插入咱们应该注意的是:

  变量的有效期范围,它只是在当前的会话内有效,若是咱们超出了这个会话,就失效了。

  那么会话指的是什么?就是咱们在linux上打开的mongo shell客户端,如今操做命令的客户端,你只要把这个客户端关闭,再从新启动,再使用上一次声明的变量,将会发现,已经无效了。

 

 

2 更新文档

  MongoDb经过update函数与save函数来更新集合中的文档

2.1 update函数

update()函数用于更新已存在的文档。

语法格式:
db.集合名称.update(
    <query>,
    <update>,
    < upsert:boolean>,
    < multi:boolean>
)

参数说明:

query:update的查询条件,相似sql update更新语法内where后面的内容

update:update的对象和一些更新的操做符等,也能够理解为sql update查询内set后面的

upsert:可选,这个参数的意思是,若是不存在update的记录,是否插入这个document,true为插入。默认为false,不插入

multi:可选,mongodb默认是false,只更新找到的第一条记录,若是这个参数为true,就把这个按条件查出来多条记录所有更新。

 

在 MongoDB 中的 update 是有两种更新方式,一种是覆盖更新,一种是表达式更新。

覆盖更新:顾名思义,就是经过某条件,将新文档覆盖原有文档。表达式更新:这种更新方式是经过表达式来实现复杂更新操做,如:字段更新、数值计算、数组操做、字段名修改等。

 

2.1.1 覆盖更新

  覆盖更新不能将multi参数设置为true,由于若是multi参数为true的话,只能使用表达式更新操做。

 

咱们首先插入一条数据

db.day.insert({id:1,title:'覆盖更新',content:'学习覆盖更新'})

 

 

经过update方法来更新

db.day.update({id:1},{title:'更新后的内容'})

 

来查看下,更新后的内容

 

 咱们能够明显发现,字段少了两个,内容也变了,对,这就是覆盖更新。正如它的名字同样,“覆盖”。因此咱们要使用这个更新必定要注意,要给全全部更新项,不然就是这种情况了。

 


 

 

2.1.2 表达式更新

语法:
db.集合名称.update(
    <query>,
    <doc_projection>
);
doc_projection 语法:
{
    $表达式:{具体更新规则}
}

 

2.1.2.1 $inc

用法:{$inc:{field:value}}

做用:对一个数字字段的某个field增长value

示例:将name为arebirth的学生的age增长5

测试数据
db.day.insert({name:'arebirth',age:17})

命令:

db.day.update({name:'arebirth'},{$inc:{age:5}})

结果:

 

 

 

2.1.2.2 $set

用法:{$set:{field:value}}

做用:把文档中某个字段field的值设为value,若是field不存在,则增长新字段并将值赋值为value

示例:把arebirth的年两设为18岁(上方的数据)

命令:

db.day.update({name:'arebirth'},{$set:{age:18}})

结果:

 

 

能够自行操做下没有的字段,看看对应的文档是否插入了新的字段

 

2.1.2.3 $unset

用法:{$unset:{field:1}}

做用:删除某个字段field   1用于占位,填写什么数字均可以,为了知足bson格式

示例:将arebirth的年龄的字段删除

命令:

db.day.update({name:'arebirth'},{$unset:{age:1}})

结果:

 

 能够发现,age字段已经不存在了。

 

2.1.2.4 $push

用法:{$push:{field:value}}

做用:把value追加到filed里面。注意:field只能是数组类型,若是field不存在,会自动插入一个数组类型

示例:给arebirth 添加别名"boy"

命令:

db.day.update({name:'arebirth'},{$push:{alias:'boy'}})

结果:

 

 

2.1.2.5 $addToSet

用法:{$addToSet:{field:value}}

做用:加一个值到数组内,并且只有当这个值不存在的时候数组才会添加进去

示例:往boy的别名字段里添加3个别名,boy、boy二、boy3

命令:

db.day.update({name:'arebirth'},{$addToSet:{alias:'boy'}})

结果:

 

 咱们会发现,和原来的值没有区别,这是由于里边已经有相同的值了,因此再也不添加。

 

2.1.2.6 $pop

用法:删除数组内第一个值:{$pop:{field:-1}}、删除数组内最后一个值:{$pop:{field:1}}

做用:用于删除数组内一个值

示例:删除上边操做的数据中的name为arebirth中alias字段中最后一个别名(绕嘴)

首先添加几个数据
db.day.update({name:'arebirth'},{$push:{alias:'boy1'}})
db.day.update({name:'arebirth'},{$push:{alias:'boy2'}})
db.day.update({name:'arebirth'},{$push:{alias:'boy3'}})
 
  
 
 

 

 

命令:

db.day.update({name:'arebirth'},{$pop:{alias:1}})

 

 咱们能够看到boy3没了。

 

2.1.2.7 $pull

用法:{$pull:{field:value}}

做用:从数组field内删除一个等于value的值

示例:删除arebirth记录中的别名boy2

命令:

db.day.update({name:'arebirth'},{$pull:{alias:'boy2'}})

结果:

 

 

2.1.2.8 $pullAll

用法:{$pullAll:value_array}

做用:用法同$pull同样,不一样的是能够一次性删除数组内的多个值

示例:删除arebirth记录内的boy1和boy别名

命令:

db.day.update({name:'arebirth'},{$pullAll:{alias:['boy1','boy']}})

结果:

 

 咱们能够看见,两个记录都已经删除了。

 

2.1.2.9 $rename

用法:{$rename:{od_field_name:new_field_name}}

做用:对字段进行重命名。底层实现是先删除old_field字段,再建立new_field字段

示例:把arebirth记录的name字段更名为newName

命令:

db.day.update({name:'arebirth'},{$rename:{name:'newName'}})

结果:

 咱们能够发现名字改变了,位置也改变了,就是由于底层实现是先删除再重建。

 


 

 

2.2 save函数

  save()函数的做用是保存文档,若是文档存在则覆盖,若是文档不存在则新增。save函数对文档是否存在的惟一判断标准是"_id"系统提供的惟一字段是否匹配。因此使用save()函数实现更新操做,则必须提供“_id"字段数据。

db.集合名称.save(
<document>
);

参数document表明要修改的文档内容,要求必须体哦那个"_id"字段数据

 

使用save()函数来实现更新操做:

db.day.save({_id:ObjectId("5dbffb7b408346b43a0df419"),newName:'rebirth'})

这个上边命令的_id根据本身客户端上经过find()函数查找出来的为准,

结果:

以前的:

 

 

 执行命令以后的:

 

 

 

3 删除文档

  MongoDB是经过remove()函数、deleteOne()函数、deleteMany()函数来删除集合中的文档

3.1 remove 函数

语法格式是:
db.集合名称.remove(
    <query>,
    <justOne:boolean>
);

参数说明:

query:要删除的文档条件,至关于sql语句中的where子句做用

justOne:可选参数,布尔类型,表明是否只删除第一个匹配条件知足的文档。默认为false,表明删除所有知足匹配条件的文档:

注意:

  此方法已通过时,官方推荐使用deleteOne和deleteMany函数来实现删除操做。且remove()函数并不会真正的释放掉存储空间,须要删除后,再用管理员权限的帐户执行db.repairDatabase()函数来释放存储空间!

 

3.1.1 remove 删除所有

删除day集合中的所有文档(破坏力强,慎用!)

db.day.remove({})

 

3.1.2 remove 条件删除

删除day集合中age字段为10的文档

db.day.remove({age:10})

 

3.2 deleteOne 函数

语法格式:
db.集合名称.deleteOne({<query>});

参数解释:

query:要删除的问单独给条件,至关于sql语句中的where子句做用

 

删除day集合中name字段为arebirth的第一个文档(由于它只删除知足条件的第一个文档,即便有多条,也就会删除第一个知足的文档)

db.day.deleteOne({name:'arebirth'})

 

3.3 deleteMany 函数

语法格式:
db.集合名称.deleteMany({<query>});
参数解释:

query:要删除的文档条件,至关于sql语法中的where子句做用

 

删除day集合中字段大于10的全部文档(这里边用到了单条件运算符"$gt" ,咱们后边会详细讲解)

db.day.deleteMany({age:{$gt:10}})

 

 

4 查询文档

  MongoDB是经过findOne()和find()函数来实现文档查询的

4.1 findOne、find函数基础应用

4.1.1 findOne 函数

findOne 函数用于查询集合中的一个文档。语法以下:

db.集合名称.findOne({
    <query>},
    {<projection>
});

参数解释:

query:可选,表明查询条件

projection:可选,表明查询结果的投影字段名。即查询结果须要返回哪些字段或不须要返回哪些字段。

 

首先咱们用上方删除命令清空咱们的day数据库,而后来插入几条数据

清空
db.day.remove({})

测试数据
db.day.insert({name:'arebirth',num:1})
db.day.insert({name:'arebirth',num:2})
db.day.insert({name:'arebirth',num:3})
db.day.insert({name:'arebirth',num:4})

 

查询day集合中第一个文档:

db.day.findOne()
or
db.day.findOne({})

 

 

查询day集合中ame字段为arebirth的第一个文档

db.day.findOne({name:'arebirth'})

 

 

查询day集合中第一个文档,且只显示num字段

db.day.findOne({},{num:1})

 

 

查询day集合中第一个文档,且不显示name和num字段

db.day.findOne({},{name:0,num:0})

 

 

 

0 不显示  1 显示

注意:

  在 projection 中不能使用{'name':0, 'age':1}这种语法格式,这是错误的语法。projection 只能定义要返回的字段或不返回的字段。_id 字段是 MongoDB 维护的字段,是惟一能够在 projection 中独立使用的。如:{_id:0, 'name':1, 'age':1}

 

 

 

 

 

 

 

 

 

相关文章
相关标签/搜索