MongoDB简介及CRUD操作

原创
小哥 3年前 (2022-10-12) 阅读数 122 #MongoDB

MongoDB

文章内容

  • MongoDB
    • 一、基本介绍
    • [二、增删除、修改和查询)(#_47)
      • [2.1 创建文档)(#21__57)
      • [2.2 阅读文档)(#22__221)
        • [2.2.1 阅读所有文件)(#221__235)
        • [2.2.2 匹配查询)(#222__243)
        • [2.2.3 比较运算符)(#223__251)
        • [2.2.4 逻辑算符)(#224__296)
        • [2.2.5 场算符)(#225__334)
        • [2.2.6 数组运算符)(#226__368)
      • [2.3 文件指针)(#23__386)
      • [2.4 更新文档)(#24__455)
      • [2.5 删除文档)(#25__609)
      • [2.6 删除收藏)(#26__629)

一、基本介绍

概念

MongoDB是存储JSON非关系数据库的文件,关闭见下图:

有很多收藏在数据库中有很多文档集合中。

运行

使用Docker运行MongoDB:

docker run --name mymongo -v /mymongo/data:/data/db -d mongo
# --name混叠的容器    

MongoDB默认使用27017端口

查看日志

docker logs 容器名称  

Mongo Shell

Mongo Shell 它是用来操作MongoDB的JS客户端

# 运行Mongo Shell
docker exec -it 容器名称mongo

二、增删除、修改和查询--------

存储在MongoDB每个文件都有一个独一无二的id,这就是所谓的文档主键储在 _id 字段中:

  • 主键是独一无二的(没有主键相同的文档不能重复),所有数据类型数组支持除外文档可以作为另一个文档的主键这是一个复合主键。
  • 如果没有指定主键在创建文档默认情况下将创建一个对象主键ObjectId("字符串包含创建时间”)
    • 创建时间提取对象的主键: ObjectId("xxx").getTimestamp()

2.1 创建文档

  • 使用 db.集合.insert() 或者 db.集合.save() 命令
    • insert命令分为insertOne、insertMany、insert

基本语法:

db..insertOne(
    ,
    {
        writeConcern: 
    }
)
  • <collection> 把它换成一个文档集合, 这个集合是自动创建的,如果它不存在 <document> 编写文档本身 writeConcern: <document> 定义了安全写这个文档创建操作 安全级别是用来确定写数据库写操作是否成功 安全写级别越高,损失降低数据丢失的风险写延迟越高 如果没有指定安全的写作水平MongoDB将使用默认级别 注意: 安全水平和写文档JSON 键值对不撑编写另一个括号 演示:

运行Mongo Shell

docker exec -it 容器名称mongo

使用test数据库

use test
# 如果数据库不存在,切换到数据库如果数据库不存在,将创建数据库的自动切换    

*查看test所有集合的数据库

show collections
# 现在新创建的test没有在数据库中收集    

写文档accounts集合

db.accounts.insertOne(
    {
        _id: "account1",
        name: "alice",
        balance: 100
    }
)

指定主键,但是没有指定安全写水平 运行结果

{ "acknowledged" : true, "insertedId" : "account1" }
  • "acknowledged" : true 表明,安全级别启用写。默认的安全级别状态显示时写* "insertedId" : "account1" 显示了文档编写的主键 *如果insertOne错误的出处

使用重复的主键id创建一个新的文档:

发生错误:

例外可以发现:

库函数print打印异常消息更直观:

自动生成主键id

省略 _id 字段:

创建多个文档

基本语法:

  • ordered 参数用于确定是否要写这些文档值为true或false,默认值是true
  • 如果 ordered 的取值为false,则MongoDB它可以写出的秩序和补充道写速度快 示例:

*如果insertMany错误的出处

  • 在编写顺序时,一个曾经遇到一个错误剩下的文件是否正确不会被执行* 写作时的顺序一些文件中的错误引起的,但是剩下的还会写正确的文件 **创建多个或单个文件

基本语法:

示例:

save命令

基本语法:

  • save当一个指令流程一个新文档调用insert指令

复合主键

  • 复合主键必须是唯一的。则报错
    • 复合主键的内容是相同的,但是键值对的顺序是不同的。

      2.2 阅读文档

      基本语法:

db.集合.find(<query>, <projection>)

  • query 表示 JSON 在格式(可以查询条件选),如果是空白的,没有任何查询条件查询所有文档* projection 结果表明,预计(可以选)
    • 部门可以返回文档分字段 ,提高的效率(注意,一些文件不返回)
    • 如果省略投影领域返回所有合格的完成整个领域文档 * 不管是否使用投影,检查查询结果的数量是相同的,只有然而,如果使用投影,返回的文档不会显示所有字段

      2.2.1 阅读所有文件

      db.集合.find()

更直观的文档显示: db.集合.find().pretty()

2.2.2 匹配查询

2.2.3 比较运算符

注意: 原来的查询条件key-value共享一个撑,现在是比较器和value还要另占一个大括号。

示例1:

注意: $ne 的文档不包含查询字段将被查询可以理解为不包括自然不等于。

示例2:

比较运算符也可以比较在字典顺序:

示例3:

注意:

  1. in、nin 对应于操作符value价值应放置在一个数组2. nin 文档没有查询字段将被过滤掉 示例4:

in在结合使用正则表达式:

2.2.4 逻辑运算符

注意: 使用逻辑运算符需要一层括号。

示例1:

注意: not 文档不包含查询字段也过滤掉。

示例2:

简化写法1(用在不同的领域):

简化写法2(使用相同的字段):

示例3:

注意: nor 文件不包含查询字段过滤掉。

2.2.5 场算符

$exists :匹配文档指定的字段是否存在 $type :文档匹配字段类型匹配的查询值 示例1:

示例2:

原始文档不包含查询字段将被添加文件不包含上述条件后查询字段不会查询:

示例3:

示例4:

2.2.6 数组运算符

all示例:

elemMatch示例:

2.3 文件指针

执行 db.集合.find() 返回一个文档集合的游标: var myCursor = db.集合.find() ,没有迭代光标,只有列出前20个文档。

您可以使用光标下标来直接访问文档的文档集合:

在光标遍历所有的文件后,或者在10分钟后,游泳标签会自动关闭。

光标功能:

  1. hasNext & next

  2. forEach

  3. limit & skip

    注意: limit(0) 表明,所有返回结果。

  4. count

    基本语法: cursor.count(<boolean>) ,如果括号为空,默认值是false。

    当在括号中false 时,limit 和 skip 两者都是无效的;在括号中true 时,才会使用 limit 和 skip 的效果:

  5. sort

    1它代表一种向前从小型到大型,-1表示逆向排序从大到小:

  6. 两个 注意 点

    • skip 在 limit 之前执行 * sort 在 skip 和 limit 之前执行

文档投影:

使用文档投影返回只有一些字段的文档:1意味着返回,0表明你没有返回:

注意: 除了文档主键,不您可以使用包括和排除同时投影操作:

2.4 更新文档

基本语法:

db.集合.update(<query>, <update>, <options>)

  • query 定义的过滤标准更新后的文档, find 过滤条件是一致的 update 更新结果定义 options 参数定义一些更新操作 注意: 这三个都是可选的。

示例:

如果可选 它不包含任何更新算子新命令将使用 整个文档直接替换相应的文档集合中(所有字段) :

注意:

  1. 主键字段不能改变,如如果你必须使用主键字段, 主键字段值必须与原文内容一致。
  2. 如果多个文档可以匹配,使用 当您更新整个文档时,只有第一个文档将被更新。

更新操作符:

如果可选 更新操作符包含在新命令将使用 相应的文档在文档中替换的特点定字段 :

$set:

更新或添加字段:

更新字段数组:

注意: 如果超出范围的数组插入时,如果有一个空数组中空白默认填充null。

$unset:

删除字段:

注意: 如果你删除数组元素数组长度不会改变将被设置为相应的元素null。

$rename:

重命名文档:

  1. 如果你重命名的文件不存在原始文档的内容将不会被改变
  2. 如果新的字段名称已经存在会置空(unset)字段名称相同的原始文档,和重命名字段进行修改
  3. 重命名嵌入文档:

    注意: 对于嵌入式阵列,这一点模式下不能使用报错。

$inc & $mul:

注意:

  1. 这两个命令只能用于数值字段2. 当作用在不存在的领域, $inc 创建字段将字段值设置为指定的增加或减少价值; $mul 创建字段,但是是的字段值是0

$min & $max:

更新后的价值比较原始值和新值:

注意: 如果更新的字段不存在,这一点这两个命令创建字段,单词段的值更新后的值。

数组更新操作符:

这些操作符只能用于数组字段:

$addToSet:

注意:

  1. 如果要插入的值已经存在数组中,这个命令不能插入重复的值
  2. 当这个命令插入文档或数组相同的顺序是不被认为是重复
  3. 一次添加多个值:

$pop:

删除第一个或最后一个元素的数组,1删除最后一个元素,-1表示第一个元素的删除:

注意: 删除数组中的最后一个元素之后该集团将是空的。

$pull & $pullAll:

删除一个特定的元素从一个数组字段:

$push:

添加一个元素的数组:

2.5 删除文档

基本语法:

db.集合.remove(<query>, <options>)

  • query:查询条件 如果过滤条件为空,所有文件将被删除 options:删除操作的参数

默认情况下, remove 满足过滤条件的命令删除所有文件,如如果你想删除满足过滤条件的只有第一个文档,你可以以使用 justOne 参数:

2.6 删除收藏

remove 命令可以删除集合中的所有文档,但是是的,不会被删除的方式将一组如下:

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门