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

MongoDB-——Collection


 

学习大纲:

  1、集合操作

  2、文档操作  


 

 

知识回顾:

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

 


 

 

一 MongoDB的集合操作


 

 

前言:

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

1 创建集合

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

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

options 可以是如下参数

 

 

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

 

1.1 使用默认集合

  在MongoDB中,我们可以不用创建集合,当我们插入一些数据时,会自动创建集合,并且会使用文档管理命令中的集合名称作为集合的名称。文档管理命令后续会详细讲解。

  创建一个新数据库,名为day(名称自己随意)

 

 

如果开启认证,需要为数据库创建访问用户。

新建 用户名为day,密码也为day  权限为writeDay  数据库为day(这里边用到了前边的知识,用户管理等。需要注意的是,创建用户我们需要使用具有userAdminAnyDatabase权限的用户,也就是我们前一博文创建的test,或者自己有相应权限的账户都可以。)

 

 

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

 

 

查询集合

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

 

 


 

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、boy2、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}

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-05 21:26  Arebirth  阅读(...)  评论(... 编辑 收藏