MongoDB自学笔记(二)

07-19 697阅读

一、前言

接着上一篇文章,在上一篇文章中学习了如何使用数据库、如何创建集合、如何往集合里添加文档,今天我们继续学习一下更新文档,更新文档相对来说比较复杂笔者打算分多次来记录学习过程。

二、文档操作

1、更新文档

基础语法:

  • db.collection.updateOne(filter, update, options)
  • db.collection.updateMany(filter, update, options)
  • db.collection.replaceOne(filter, update, options)
  • db.collection.update(filter,update,options)

    解释:

    collection:要更新的集合

    filter:过滤条件

    update:更新后的操作

    options:

    详细的参数解释:

    db.collection.updateOne()

    示例1:简单的更新

    1、首先我们创建一个名为inventory(库存)的集合,并往里插入一些数据

    db.inventory.insertMany( [
       { item: "canvas", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
       { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
       { item: "mat", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
       { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
       { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "P" },
       { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
       { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
       { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
       { item: "sketchbook", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
       { item: "sketch pad", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
    ] );
    

    结果:

    MongoDB自学笔记(二)

    2、例如我们想要将第一条数据 item=canvas的数据的 数量从100改为80。很自然的我们会认为是这样写的

    db.inventory.update({"item":"canvas"},{"qty":80})
    

    我们运行一下看看结果

    MongoDB自学笔记(二)

    MongoDB自学笔记(二)

    注意坑:很明显这个不是我们想要的结果,这里是把整个文档替换了。
    正确的打开姿势:

    我们应该使用**“更新操作符”**来更新数据。(更新操作符放在后文讲解),这里我们尝试这将第二条数据的qty更新为100,采用更新操作符后后的语句是这样的。

     db.inventory.update({"item":"journal"},{ $set: { "qty":100}}  )
     或者
     db.inventory.updateOne({"item":"journal"},{ $set: { "qty":100}}  )
    

    运行结果:很明显是符合我们的预期了。

    MongoDB自学笔记(二)

    MongoDB自学笔记(二)

    示例2:更新嵌套文档

    我们知道MongoDB是面向文档的,而文档本质就是JSON,JSON可以有嵌套的形式。以上面的“库存”的集合为例,我们想把第三条数据的 size下的h从27.9 改为30,应该怎么写呢?其实也很简单,只需要用 "."来表示。

    db.inventory.update({"item":"mat"},{ $set: { "size.h":30}}  )	
    或者
    db.inventory.updateOne({"item":"mat"},{ $set: { "size.h":30}}  )	
    

    运行结果:

    MongoDB自学笔记(二)

    MongoDB自学笔记(二)

    需要注意的是:updateOne这会根据匹配条件查询出第一条满足条件的数据,并且更新。如果要批量更新则需要使用update或者updateMany。

    2、更新操作符

    上一个小结中我们引入了更新操作符,这个概念,接下来我们继续学习MongoDB中的更新操作符

    语法:

    {
       : { : , ... },
       : { : , ... },
       ...
    }
    

    例如:$set: { $set: { “a.2”: , “a.10”: , } }

    2.1、$currentDate

    (1)含义:将字段的值设置为当前日期,可以使日期或者时间戳

    (2)语法:

    { $currentDate: { field1: typeSpecification1, … } }

    可以为以下任一项:

    • 布尔值为 true 可将字段值设置为当前日期作为“日期”,或者
    • 显式指定类型的文档 { $type: "timestamp" } 或 { $type: "date" }。该操作符_区分大小写_,仅接受小写的 "timestamp" 或小写的 "date"。

      示例:首先我们给库存集合添加一个名为 lastModifyTime的字段,并且给个默认值

      db.inventory.updateMany({},{$set:{"lastMoidfyTime":"2024-07-15 12:00:00"}})
      

      MongoDB自学笔记(二)

      现在我们要将最后更新时间改为当前时间

      db.inventory.updateMany({}, {
          $currentDate: {
              "lastMoidfyTime": true
          }
      })
      

      运行结果:

      MongoDB自学笔记(二)

      可以看到时间是变了,不过这里要注意的是Mongo默认使用的是UTC+0:00而中国用的是UTC+8:00,所以会有8个小时的时差。

      解决方案也不难:

      (1)在应用层来+8小时

      (2)存时间戳

      MongoDB自学笔记(二)

      2.2.$inc

      含义:操作符将字段按指定值递增

      语法:{ $inc: { field1: amount1, field2: amount2, … } }

      inc只能作用于数字类型的字段上,如果字段不存在则会创建对应的字段,如果作用在null值上会报错。

      示例:我们将库存表中notebook的数量+2

      db.inventory.updateOne({"_id":ObjectId("66951edbdf24000083007d77")},{ $inc:{"qty":2} })
      

      运行结果:

      MongoDB自学笔记(二)

      MongoDB自学笔记(二)

      同理如果想要减少那就传入负数 例如

      db.inventory.updateOne({"_id":ObjectId("66951edbdf24000083007d77")},{ $inc:{"qty":-2} })
      
      2.3、$mul

      含义:将字段的值乘以指定量。

      语法:{ KaTeX parse error: Expected 'EOF', got '}' at position 35: …umber1>, ... } }̲ 和上一节中的inc类似,这里不在赘述。

      2.4、$min / $max

      含义:仅当指定值小于现有字段值时才更新字段。| 仅当指定值大于现有字段值时才更新字段。

      语法:{ $min: { field1: value1, … } } | { $max: { field1: value1, … } }

      示例:我们想把数量 >80的 全改为80

      db.inventory.updateMany({}, {$min:{"qty":80}})
      

      运行结果:

      MongoDB自学笔记(二)

      MongoDB自学笔记(二)

      3、小结:

      今天学习了MongoDB中的更新文档,也学了部分的操作符。还有剩下的将放在下一篇文章中,希望对你有所帮助。

      未完待续

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]