MongoDB-——Collection
学习大纲:
1、集合操作
2、文档操作
知识回顾:
上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障。
一 MongoDB的集合操作
前言:
MongoDB中的集合是一组文档的集,相当于关系型数据库中的表。
1 创建集合
MongoDB使用db.createCollection()函数来创建集合。
代码语言:javascript复制语法格式: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']})
插入文档 我们现在将多个文档放入到了一个变量中,所以在插入数据时,可直接使用插入单个文档的函数
查询文档
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'},{$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}