• MongoDB(5)---文档的增删改查


    在这里插入图片描述

    上一篇: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)—索引

  • 相关阅读:
    公钥,私钥和数字签名这样最好理解
    SolrCloud的官方配置方式
    由于Windows和Linux行尾标识引起脚本无法运行的解决
    python模块名和文件名冲突解决
    Linux下编译安装python3
    Storm集群的安装配置
    Linux下编译安装Apache 2.4
    SELinux的关闭与开启
    Spring MVC配置静态资源的正常访问
    SolrCloud环境配置
  • 原文地址:https://www.cnblogs.com/wgty/p/12810425.html
Copyright © 2020-2023  润新知