实验——在MongoDB中管理数据库和集合操作

一、实验目的

  1. 掌握在 MongoDB 中管理数据库和集合操作
  2. 掌握在 MongoDB 中插入、修改及删除文档操作

二、实验原理

MongoDB 中数据被分组存储在数据集中,被称为一个集合(Collenction)。对于存储在MongoDB 数据库中的文件,用户不需要知道它的任何结构定义。在存储数据时是以键—值对的集合:键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档。
MongoDB 集合类似于关系数据库中的表。先认识一下 MongoDB 结构。

使用修改器来完成局部更新操作,更新运算符见下表


三、实验内容

  1. 在 MongoDB shell 中管理数据库和集合
  2. 操作集合中的 MongoDB 文档

四、实验步骤

1.启动 MongoDB 数据库
2.启动 MongoDB Shell 客户端
以上基本操作演示图略。
3.建库、建集合操作

4.添加文档
4.1添加一个新的文档到集合
语法格式:db.collection.insert()
4.2同时添加多个文档,可以传入数组

4.3添加文档再包含文档的(层级三级)

5.删除列表中的数据
5.1.删除列表中所有数据
语法格式:db.[documentName].remove()

5.2 根据条件删除

5.3删除数据库操作

6.数据更新命令
Mongodb 更新有两个命令:update、save。
6.1 update 命令
update 命令格式:db.collection.update(criteria,objNew,upsert,multi)
参数说明:
 criteria:查询条件
 objNew:update 对象和一些更新操作符
 upsert:如果不存在 update 的记录,是否插入 objNew 这个新的文档,true 为插入,默认为 false,不插入。
 multi:默认是 false,只更新找到的第一条记录。如果为 true,把按条件查询出来的记录全部更新
代码示例:

示例1:把 count 大于等于 20 的 class name 修改为 c3

由于没有指定 upsert 和 multi 的值,所以全部默认为 false,由结果可以看出,只修改了第一条符合条件的记录。
示例 2:把 count 大于 等于20 的 class name 修改为 c4,设置 multi 为 true

由于指定了 multi 为 true,所以对两条符合条件的记录都进行了更新。
示例 3: 把 count 大于 50 的 class name 修改为 c5,设置 upsert 为 true

在集合中没有 count 大于 50 的记录,但是由于指定了 upsert 为 true,如果找不到则会插入一条新记录。
6.2. save 命令
Mongodb 另一个更新命令是 save,格式如下:
db.collection.save(obj)
obj 代表需要更新的对象,如果集合内部已经存在一个和 obj 相同的“_id”的记录,Mongodb 会把 obj 对象替换集合内已存在的记录,如果不存在,则会插入 obj 对象。
6.3. 数据更新操作符
1.$ inc
用法:{$inc:{field:value}}
作用:对一个数字字段的某个 field 增加 value
示例:将 name 为 kanglei 的学生的 age 增加 5

2. $ set
用法:{ $ set:{field:value}}
作用:把文档中某个字段 field 的值设为 value
示例: 把 kanglei 的年龄设为 23 岁

从结果可以看到,更新后年龄从 27 变成了 23
3. $ unset
用法:{ $ unset:{field:1}}
作用:删除某个字段 field
示例: 将 kanglei 的年龄字段删除

4. $ push
用法:{ $ push:{field:value}}
作用:把 value 追加到 field 里。注:field 只能是数组类型,如果 field 不存在,会自动插入一个数组类型
示例:给 kanglei 添加别名”michael”

5. $ pushAll

用法:{ $ pushAll:{field:value_array}}
作用:用法同 $ push 一样,只是 $ pushAll 可以一次追加多个值到一个数组字段内。
示例:给kanglei 追加别名 A1,A2

这里报错,因为pushAll在mongo的3.6之前时可用的,之后的版本不可用
6. $ addToSet
用法:{ $ addToSet:{field:value}}
作用:加一个值到数组内,而且只有当这个值在数组中不存在时才增加。
示例:往 kanglei 的别名字段里添加两个别名 A3、A4

由结果可以看出,更新后 ailas 字段里多了一个对象,这个对象里包含 2 个数据,分别是 A3、A4。
7. $ pop
用法:删除数组内第一个值:{ $ pop:{field:-1}}、删除数组内最后一个值:{ $ pop:{field:1}}
作用:用于删除数组内的一个值
示例: 删除 chenzhou 记录中 alias 字段中第一个别名

由结果可以看出,第一个别名 Michael 已经被删除了。
再使用命令删除最后一个别名:

由结果可以看出,alias 字段中最后一个别名[“A3”,“A4”]被删除了。

8.$ pull
用法:{ $ pull:{field:_value}}
作用:从数组 field 内删除一个等于_value 的值
示例:删除 chenzhou 记录中的别名 A1

9.$ pullAll
用法:{$ pullAll:value_array}
作用:用法同$pull 一样,可以一次性删除数组内的多个值。
示例: 删除 chenzhou 记录内的所有别名

可以看到 A1 和 A2 已经全部被删除了。
10. $ rename
用法:{ $rename:{old_field_name:new_field_name}}
作用:对字段进行重命名
示例:把 chenzhou 记录的 name 字段重命名为 sname

由结果可以看出 name 字段已经被更新为 sname 了。