在这里插入图片描述

上一篇:MongoDB(4)—集合创建和删除

文档的增删改查

一、创建文档

1.插入单个文档数据:
  使用下面语法可以向某个集合中插入单个的文档数据

db.集合名称.insert()
或者
db.集合名称.save()

栗子,我们需要在trade_db库的students集合中插入有一些数据:
在这里插入图片描述
文档插入数据之后返回结果如上图所示,则文档数据插入成功。

2.插入多个文档数据(批量插入):

db.集合名称.insertMany()

栗子:我们需要向students集合中批量插入下面得数据:

db.students.insertMany([
    {
        "name": "zhangsan",
        "age": 18
    },
    {
        "address": "beijing",
        "phone": "18112341234"
    }
])

在这里插入图片描述
上图中得结果表示批量数据插入成功。

3.插入文档数据时使用try catch
  因为MongoDB如果使用事务会影响写入性能,所以一般我们的MongoDB不建议使用事务功能,但是在批量插入的时候,如果其中的某一条数据插入失败了怎么办?没有事务那就比较麻烦了,这里我们可以使用try catch语句块来解决:

try {
      db.students.insertMany([
          {
              "name":"zhangsan",
          "age":18,
          "code":1
    },
      {
        "name":"lisi",
          "address":"beijing",
          "phone":"18112341234",
          "code":1
      }
])
    } catch (e) {
      print(e);
    }

  首先我们将之前的集合students中所有数据删除掉,然后使用try catch的方式来批量插入数据,如果有异常将异常信息打印出来,然后再去做相应的调整。

在这里插入图片描述
数据插入成功。

二、查询文档

1.查询所有得文档数据

  使用下面命令可以查看集合中得所有文档

db.集合名称.find()

在这里插入图片描述

2.按照条件查找数据
db.集合名称.find({json格式的条件参数}) //db.students.find({"name":"zhangsan"})

在这里插入图片描述
查询的结果就只有name参数为zhangsan的那条文档数据了。

3.获取所有查询出来的多个数据中的第一条

  使用下面的命令可以只获取所有查询数据中的第一条,相当于limit(0,1)
在这里插入图片描述

4.投影查询

什么是投影查询?
  投影查询就是只显式指定的字段而不是显式所有的字段。类似于mysql中的select *select 字段名的区别。

使用下面的语法可以进行投影查询:

db.集合名称.find({查询条件},{显式的字段:1,显式的字段:1……})  

栗子:在下面的数据中
在这里插入图片描述
我想要查询出来code为1,并且只显式name字段:

db.students.find({code:1},{name:1})

find方法里面的第一个参数是查询条件,第二个参数name:1表示只显式name字段
在这里插入图片描述
在上面的查询结果中,我们发现_id字段如果不做指定的话,默认是显式的,如果想要不显示_id字段,我们可以使用如下命令

db.students.find({code:1},{name:1,_id:0})

在这里插入图片描述
如果我们不仅想要显式name字段,还想要显式code字段,则在第二个参数的括号类进行指定

db.students.find({code:1},{name:1,_id:0,code:1})

在这里插入图片描述
总结:
  第二个括号内字段对应的1或者0分别代表了显式此字段或者不显示此字段

5.count查询
db.集合名称.count(查询条件)

5.1 查询集合中所有的文档数量
在这里插入图片描述

5.2 查询集合中指定条件的文档数量
在这里插入图片描述

6.分页查询

测试使用的数据:

db.students.insertMany([
    {
        "name": "zhangsan",
        "age": 18,
        "code": 1
    },
    {
        "name": "lisi",
        "address": "beijing",
        "phone": "18112341234",
        "code": 1
    },
    {
        "name": "wangwu",
        "address": "shanghai",
        "grade": NumberInt(86),
        "code": 1
    },
    {
        "name": "zhaoliu",
        "address": "sichuan",
        "grade": NumberInt(91),
        "code": 2
    }
])

6.1 返回指定条数的数据(limit)
现在需要查询students集合中的code为1的所有数据中的前2条:
在这里插入图片描述
6.2 返回跳过指定条数之后剩下的数据(skip)

案例:db.students.find({code:1}).skip(2) //不要所有code为1的数据中的前2条

在这里插入图片描述
6.3 分页查询

案例:students集合中的4条数据:
第一页:展示前2条
在这里插入图片描述

第二页:展示第3条
在这里插入图片描述
第三页:展示第4条
在这里插入图片描述

7.排序查询

排序查询的语法:

db.集合名称.find({条件}).sort(排序字段:1或者-1)  //1代表升序排序  -1代表降序排序

在下面的数据中:
在这里插入图片描述
我需要将students中的数据进行降序排序
在这里插入图片描述
总结:
  当limit()skip()sort()三个特殊方法放在一起使用的时候,执行顺序依次是:sort()skip()limit(),并不是按照我们写这三个方法的顺序来执行的。

8.复杂查询

8.1 正则匹配查询

db.集合名称.find({字段:/正则表达式/})

8.2 比较查询

大于:db.集合名称.find({字段:{$gt:}})
小于:db.集合名称.find({字段:{$lt:}})
大于等于:db.集合名称.find({字段:{$gte:}})
小于等于:db.集合名称.find({字段:{$lte:}})

不要问等于应该怎么表示……

等于:db.集合名称.find({字段:})

8.3 包含查询

MongoDB中,包含使用$in,不包含使用$nin

包含:  db.集合名称.find({字段:{$in([,值……])}])  
不包含:  db.集合名称.find({字段:{$nin(,,……)}])  

8.4 条件查询
当我们需要查询一个同时满足2个以上的条件的数据,可以使用$and操作符,类似于mysql中的and

db.集合名称.find({$and:[{字段:},{字段:}……]})

在这里插入图片描述

三、修改文档

1.覆盖式的修改

修改语法:

db.集合名称.update({查询条件},{修改条件},upsert: multi: writeConcern:)

upsert:此参数可选。如果不存在update的记录,是否插入?true为插入,false为不插入。
mutli:此参数可选,MongoDB默认是false,只修改找到的所有数据中的第一条。指定为true表示修改找到的所有数据。
writeConcern:此参数可选,表示抛出的异常级别

等级 描述
-1 忽略网络错误
0 不要求进行写入确认
1 要求进行写入确认
2 要求以写入到副本集的主服务器和一个备用服务器
majority 要求已写入到副本集中的大多数服务器中

在下面的数据中
在这里插入图片描述
我想把name为zhangsan的那条数据的code值修改为20

db.students.update({"name":"zhangsan"},{"code":NumberInt(20)})

在这里插入图片描述
  在上面的命令中,code值为什么不直接写20而是要用NumberInt()函数进行转换一下?

  因为MongoDB默认情况下将所有的数字定义为浮点数(double)类型,我们可以使用NumberInt()函数来指定数字为整数。

以上的修改方式是覆盖式的修改,可以查看一下此时集合中的此条数据:
在这里插入图片描述
此条数据中除了_id字段没有变化,剩下的字段均被code:20所覆盖。

2.局部更改

  如果我们不想要覆盖式的修改而是只对个别字段值进行修改,则可以使用下面的语法:

db.集合名称.update({查询条件},{$set:{修改条件}})

栗子:我们想把name:lisi这条记录的code值修改为code:20,但是不改变该条数据的其他字段值。
在这里插入图片描述
此时我们再查看一下students集合的数据:
在这里插入图片描述

3.批量修改

  在下面的数据中:
在这里插入图片描述

如果我想批量的将code:1的数据的name修改为wangwu。则可以使用下面的语法:

db.集合名称.update({查询条件},{$set:{修改条件}},false,true ))

在这里插入图片描述

栗子:

此时再查看一下students集合中的数据:
在这里插入图片描述

4.列值增长的修改

  现在我想把age:18的这条数据的code值在原有的基础上加1

db.集合名称.update({查询条件},{$inc:{修改条件}})

在这里插入图片描述
此时查询下集合中的数据:
在这里插入图片描述
如果想要在原有的值上递减1,则直接将NumberInt(1)修改为NumberInt(-1)就OK了。

5.文档字段追加
db.集合名称.update({查询条件},{$set:{修改内容}},{upsert:true})

栗子:在下面数据中
在这里插入图片描述
想要在第一条数据中追加一个address字段
在这里插入图片描述
查询此时的students集合的数据:

在这里插入图片描述
字段追加成功。

四、删除文档

删除文档数据的语法:

db.集合名称.remove(查询条件)
1.全部删除(慎用)
db.集合名称.remove({})
2.按条件删除
db.集合名称.remove({})

栗子:我要删除students集合中age:18的这条数据
在这里插入图片描述
然后再查询一下集合中的数据:
在这里插入图片描述

下一篇:MongoDB(6)—索引

posted on 2020-02-12 18:12  无关痛痒qaq  阅读(68)  评论(0编辑  收藏  举报