MongoDB权威指南三四章学习体会

前言

最近在学习Mongodb权威指南,其中有些内容,还是比较难理解,和大家分享一下。

1、数组update

update用于更新文档,更新操作分成两阶段完成,首先找到目标文档,然后修改目标文档。

涉及到数组操作的operator有以下四个:

MongoDB权威指南三四章学习体会

示例集合 students :

{

​ “name”: “Tom”,

​ “gender”: “male”,

​ “class_id”: “300”,

}

push:push向数组中添加一个元素,一次添加多个元素需要配合each

(1)向集合中加入字段选修课 :

1.db.students.update({“name”:”Tom”}, {$push : {“optional lesson”: “math”}})

MongoDB权威指南三四章学习体会

(2)向学生”Tom”的”optional lesson”字段加入多个元素:

db.students.update({“name”:”Tom”}, {$push : {“optional lesson”: {$each: [“math”, “Chinese”, “Spanish”]}}})

值得注意的是,push操作是允许添加重复值的,因此上面的语句如下图所示:

MongoDB权威指南三四章学习体会

使用addToSet会将待插入元素和文档中的数组元素进行比较,实现去重添加的效果。

(3) 向学生”Tom”的”optional lesson”字段加入多个元素,并去重:

db.students.update({“name”:”Tom”}, {$addToSet : {“optional lesson”: {$each: [“math”, “Chinese”, “Spanish”]}}})

MongoDB权威指南三四章学习体会

可以看到这样,就达到了去重的效果

2、upsert

在使用update的时候,可能存在没有找到指定文档的情况,如果在这种情况中,我们想让Mongodb创建出一个默认的文档的话就可以使用upsert。

db.test.update({“count”: 25}, {$inc: {“count”: 3}}, true)

3、修改器速度

这一节主要是讲了填充因子和空间分配大小在文档更新时的作用。

每次执行更新操作,都有可能增大文档的大小,如果该文档的前后连续的物理位置都存储有其他文档,那么当我们写入该文档的时候就会把它移动到集合的末尾。

每次执行这样的移动操作的时候,mongodb都会增加集合的填充因子(padding factor)。下一次执行插入操作时,给新文档分配的空间: alloc_space =

actual_space * padding_factor。通过设置padding factor减少了文档搬移的可能性,从而减少了硬盘IO的发生。同时这里也是局部性原理的体现,如果频繁发生

文档的搬移说明当前文档的更新操作比较频繁,后续插入的新文档大概率也会出现搬移的操作。如下图,{b:2}的更新操作导致文档被搬移到集合末尾,从而导致

填充因子增加(>1)。

MongoDB权威指南三四章学习体会

从前文可以看到每次发生文档的搬移操作之后,在原位置就会出现一段空闲空间(free space)。如果没有特殊的分配策略的话,这些空闲空间的大小就是原文档的

大小,意味着这些空间的大小是相当随机的,也就意味着新插入的文档大概率会无法利用这些空闲的空间,这些虽然空闲但是没有办法被利用的空间被称作碎片。

为了减少空间碎片,我们可以采用usePowerOf2Sizes。

db.runCommand({"collMod" : collectionName, "usePowerOf2Sizes": true)

使用该选项之后,每次分配空间是2的幂次。这样留下的空闲空间都会是fixed-size(固定空间),而不是随机大小。从而减少了碎片的产生。

4、数组find

$all

all用来匹配数组中的多个值。假设我们有一个如下的文档:

  {
    _id: ObjectId("621b3d2a7c51445f6727e045"),
    fruits: [ 'apple', 'banana', 'pineapple', 'orange' ]
  }

可以使用如下的语句去搜索指定文档:

db.test.find({"fruits": {$all: ["apple", "banana"]}})

$slice

find的第二个参数可以指定返回的键—find({}, {“return_key”: 1})。使用slice语句替换1,可以指定需要返回的数组元素。

test> db.test.find()
[
  {
    _id: ObjectId("621b3d2a7c51445f6727e045"),
    fruits: [ 'apple', 'banana', 'pineapple', 'orange' ]
  }
]

test> db.test.find({}, {"fruits": {$slice: 1}})
[ { _id: ObjectId("621b3d2a7c51445f6727e045"), fruits: [ 'apple' ] } ]

返回一个匹配的元素

使用$操作符可以返回第一个满足查询要求的数组元素

db.restaurants.find({"grades.grade": "A"}, {"grades.$": 1})

$elemMatch

使用elemMatch之后,查询条件必须满足每一个数组元素,才会返回。如下图所示,在第一个find中使用了elemMatch返回的结果中是每个元素都满足

80

Original: https://www.cnblogs.com/dennis-wong/p/15943787.html
Author: 成蹊0xc000
Title: MongoDB权威指南三四章学习体会

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582770/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java使用Redis删除指定前缀Key

    Java使用Redis删除指定前缀Key // 获取Redis中特定前缀 Set keys = stringRedisTemplate.keys("BLOG_SORT_B…

    Linux 2023年5月28日
    096
  • 打造一个红旗(redflag)Linux的基础镜像(base image)

    由于工作原因,想找一个红旗Linux的基础镜像(base image)。网上搜了一下,但没有现成的。起初是想找对应的centos版本来代替,但又怕有些莫名其妙的问题。 官方文档 不…

    Linux 2023年6月8日
    081
  • MySQL数据库用户授权

    相关库:mysql 相关表:user 查看权限表: 5.7之前的版本 select user,host,password from mysql.user; 5.7之后的版本 sel…

    Linux 2023年6月14日
    080
  • Tensorflow-逻辑斯蒂回归

    1.交叉熵 逻辑斯蒂回归这个模型采用的是交叉熵,通俗点理解交叉熵 推荐一篇文章讲的很清楚: 因此,交叉熵越低,这个策略就越好,最低的交叉熵也就是使用了真实分布所计算出来的信息熵,因…

    Linux 2023年6月6日
    084
  • 使用 sh -x 进行 shell 脚本调试

    转载请注明出处: sh -x 命令的执行,会将shell 命令的每一个执行步骤进行打印,可以查看到 整个命令或脚本的执行过程的 debug。 sh -n 只读取shell脚本,检测…

    Linux 2023年5月28日
    0117
  • NoteOfMySQL-09-存储过程与函数

    常用的SQL语句在执行时需要先编译,然后执行;而存储过程(Store Procedure)是经编译后存储在数据库中的SQL语句集,在数据库中创建和保存。 一、存储过程与函数的区别 …

    Linux 2023年6月14日
    074
  • 每周一个linux命令(netstat)

    基础环境 netstat 命令介绍 打印网络连接、路由表、接口统计信息、伪装连接和多播成员,使用最多的是打印网络连接信息。 netstat 命令安装 yum install net…

    Linux 2023年6月8日
    095
  • linux系统编码修改

    查看当前系统默认采用的字符集locale 查看系统当前编码echo $LANG如果输出为:en_US.UTF-8 英文zh_CN.UTF-8 中文 查看系统是否安装中文字符集loc…

    Linux 2023年6月6日
    099
  • Java基础 String

    String类 字符串是一个特殊的对象。 字符串一旦初始化就不可以被改变。 String s="abc"; 特点: String构造函数 主要几个String构…

    Linux 2023年6月14日
    0134
  • Java中List<T>和List<?>的区别【转载】

    ` List、List<?>、List这三者都可以&#x…

    Linux 2023年6月8日
    089
  • 概率算法_二项分布和泊松分布

    本次函数有 1、阶乘 2、计算组合数C(n,x) 3、二项概率分布 4、泊松分布 以下是历史函数 继续概率,本次是二项分布和泊松分布,这个两个还是挺好玩的,可以作为预测函数用,因为…

    Linux 2023年6月6日
    099
  • ​探秘 Web 水印技术

    Web 水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印),本文将分别予以介绍,带你探秘…

    Linux 2023年6月8日
    0117
  • RPA 抖音机器人汇总

    bash;gutter:true; 一、RPA 抖音小店催好评机器人 RPA机器人详情: 1、配置好抖音小店订单号与催好评话术 2、启动抖音小店催好评机器人 3、机器人打开飞鸽客服…

    Linux 2023年6月7日
    093
  • GDT表实现

    GDT是保护模式下的内存段登记表。 段界限计算 段界限用 20 个二进制位来表示。只不过此段界限只是个单位量,它的单位要么是字节,要么是 4K,这是由描述符中的G位来指 定的。由于…

    Linux 2023年6月7日
    086
  • Redis分布式锁的使用与实现原理

    模拟一个电商里面下单减库存的场景。1.首先在redis里加入商品库存数量。 2.新建一个Spring Boot项目,在pom里面引入相关的依赖。 <dependency&gt…

    Linux 2023年5月28日
    0114
  • OpenStack 创建自定义的QCOW2格式镜像

    一、安装KVM虚拟机 1.1 虚拟机安装虚拟化软件包 注意:虚拟机指的是CentOS7.8 #挂载光盘 [root@cloudcs ~]# mount /dev/cdrom /mn…

    Linux 2023年6月8日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球