一、mongodb的原理介绍:

  特点:

  

  为了理解以上特点,我们从一个真实的场景出发,介绍mongodb的原理:参考视频:https://www.youtube.com/watch?v=4SxHNmk5JHI

  我们需要从华为的app商店里抓取一些app的详细信息的数据;如下图,这是我们爬到的一条数据,是一条关于微信的详细信息数据:

  

  实际上,我们每次抓取一条这样的信息,我们可以称为一个document。这也是所谓的基于document的设计。

  当然了,问题是如何保存我们这样的数据,或是说documents呢?最基本的是存在文件里。

  我们假如蓝色区域是我们的文件,每个document顺序地存在文件中,比如第一个是关于微信信息的一个document。

  

  但是,问题出来了,当我们顺序存储之后,当微博出了一个新的版本“5.7.0”,我们怎么把这样的信息添加到微博的那个document中呢?

  由于数据是连续的存在硬盘中,我们可以把原来微博的那个document的信息copy下来,然后在顺序添加一个含有版本信息“5.7.0”的document。如下图:

  

  之后,我们再把第二个document删掉。

  但是这种方法有个问题,当我们在遍历的时候,中间出现很多gaps,从而带来读取写入的低效。如下图:

  

  

  一个讨巧的方法就是,我们建立一个指针,也就是每个document都存一个指针,指向下一个document的位置。这样读取的时候就可以读取下一个document。

  同理,我们也可以建立反向指针,如下图:

  

  好,刚才我们说的是出现这些fragment或是gaps时候怎么能够读取的更快。

  那我们有没有方法能减少这些碎片呢?

  

  减少碎片,也就是比如我们在修改微博的信息的时候尽量减少这些“document”快的移动,方法就是加"pading",也就是在每个document后边都预留一块空白的pading,

  如下图:

  

  当我们有新得数据需要添加的时候,就可以添加到pading里,从而能够保证不用迁移整块数据:

  

  那么,既然我们知道怎么保存这些document到文件中,下面我们看下怎么保存到硬盘上:

  

  如上图,我们的硬盘上已经有一些文件,我们的新文件只能零散地存在夹缝之中,又造成了很多碎片,这是另外一种碎片。

  导致读取的时候不能顺序读取,造成了很多随机寻道的事件,造成了低效率。

  How to reduce this fragments?

  有一种方法,就是我们提前预先申请好一块大的空间。能保证连续的保存很多文件。

  那么,如何选择预先申请的空间大小。小的话也会出现碎片,大的话会浪费。

  我们的方法是double上升,也就是我们从最近本的16M开始,16M写满了申请一个32M的,写满了再申请一个64M的,128M...2G,不能无限上升,即最大为2G的,以后再申请就是2G的。如下图:

  

  现在,写的问题解决了,我们需要面临读的问题。

  

  即,我们怎么查找ID在这个区间的所有的document呢?

大家,如果做过的话,我们都知道,最基本的方法是用一个二叉搜索树,因为遍历和插入复杂度为log(n),每个树的节点左侧是比它数小的节点的集合,右侧是比它大的节点的ID结合。这种方法不断的扩展。每个节点位置,都存放一个指针,指向在硬盘上存储的位置,如下图。当然,在实际使用中,我们会使用二叉搜索树的升级版:Btree。

  

  ok ,当目前为止,你已经实现了Mongodb。你已经知道mongodb长什么样,以及为啥这样?’

  我们再看开头说的mongodb的特点:

  第一,document的属性都可以随意修改。即上图的小绿色条,大小和内容都可以不一样

  其次,添加padings。避免document快的移动增加的碎片。第三,添加双向指针,提高效率。

  第四,mongodb硬盘的保存过程中实际上保存在。document保存在2上升的硬盘上。最后,Btree的方式建立索引,提高查找的效率。

二、python操纵mongodb

  参考PyMongo - MongoDB APIhttps://api.mongodb.com/python/current/

  

  

python与mongodb的更多相关文章

  1. Python 操作 mongodb 数据库

    原文地址:https://serholiu.com/python-mongodb 这几天在学习Python Web开发,于 是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样 ...

  2. python 连 mongodb

    这几天在学习Python Web开发,于是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样的好玩意儿,何必还自己造车呢?决定使用Tornado这个框架,然后数据库方面决定顺便 ...

  3. Python与Mongodb交互

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案 MongoDB 将数据存储为一个文档,数据结构由键值 ...

  4. python操作mongodb

    # python操作mongodb # 首先,引入第三方模块pymongo,该模块是python用来操作mongodb的 import pymongo # 第二步,设置ip地址,以及表格名称,表格名字 ...

  5. 使用Python操作MongoDB

    MongoDB简介(摘自:http://www.runoob.com/mongodb/mongodb-intro.html) MongoDB 由C++语言编写,是一个基于分布式文件存储的开源数据库系统 ...

  6. 当用户管理系统遇上python和mongodb后……

    Overview: 环境 前言 效果图 mongdb安装 代码涉及知识点 关于windows的cmd下执行python文件显示中文乱码的问题 总结 0.环境 操作系统:Windows Python版本 ...

  7. Python 连接MongoDB并比较两个字符串相似度的简单示例

    本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...

  8. python操作三大主流数据库(10)python操作mongodb数据库④mongodb新闻项目实战

    python操作mongodb数据库④mongodb新闻项目实战 参考文档:http://flask-mongoengine.readthedocs.io/en/latest/ 目录: [root@n ...

  9. python操作三大主流数据库(9)python操作mongodb数据库③mongodb odm模型mongoengine的使用

    python操作mongodb数据库③mongodb odm模型mongoengine的使用 文档:http://mongoengine-odm.readthedocs.io/guide/ 安装pip ...

  10. python操作三大主流数据库(8)python操作mongodb数据库②python使用pymongo操作mongodb的增删改查

    python操作mongodb数据库②python使用pymongo操作mongodb的增删改查 文档http://api.mongodb.com/python/current/api/index.h ...

随机推荐

  1. iOS 反射 学习 和 运用

    iOS  反射 学习 和 运用 反射:  通过 类名来获得生成的相应的类的实例 的这种机制  叫 反射 常用的反射方式 把 NSDictionary  转成 自定义 model 自定义 model 转 ...

  2. iOS imageNamed VS imageWithContentsOfFile

    今天 又学习了 一个 提高应用交互效率 降低内存的 小知识 结论: (1)mageNamed加载图片,并且把image缓存到内存里面, (2)imageWithContentsOfFile是只显示图片 ...

  3. 静态库引入引起的错误解决方案,ld: warning: ignoring file ”…/XXX.a”, file was built for archive which is not the architecture being linked (armv7): “…/XXX.a” Undefined symbols for architecture armv7: "_OBJC_CLASS_$

    想目中不免会引入一些静态库,可是有时加入'.a'文件后编译便会报以下错误 ld: warning: ignoring file ”…/XXX.a”, file was built for archiv ...

  4. libhdfs的配置和使用

    测试环境:centos6.10,hadoop2.7.3,jdk1.8 测试代码:HDFSCSample.c #include "hdfs.h" #include <strin ...

  5. ETL应用:使用Pro*C写入文件信息入库的方法

    ETL处理过程中,经常需要进行文件校验,如文件级校验.记录级校验,需要保存文件的基本信息,文件名.文件大小.数据日期等,使用Pro*C的一种方法如下: #include <stdio.h> ...

  6. 一个声明被new多次

    如果声明一个指针变量,然后为这个变量new多次, eg:Type* A: A = new Type();//1 A = new Type();//2 最后变量A指向的是最后的那个对象,与前面new的无 ...

  7. 关于C++ 中的this 的理解

    关键字this 通常被用在一个class内部,指正在被执行的该class的对象(object)在内存中的地址.它是一个指针,其值永远是自身object的地址.

  8. centos iscsi 配置

    首先是服务器的设置:[root@localhost 桌面]# yum install scsi-target-*  -y     安装服务  配置yum的方法太简单了,我就不写了[root@local ...

  9. Spark 总结2

    网页访问时候 没有打开 注意防火墙! 启动park shell bin下面的spark-shell   这样启动的是单机版的 可以看到没有接入集群中: 应该这么玩儿  用park协议  spark:/ ...

  10. 【P3522】TEM(单调队列+DP)

    这个题,题目很长,然而亲爱的翻译已经帮你读完题了,一句话题意. 要求不下降的最长,那么这一段肯定满足队首的左区间不大于队尾的右区间,单调队列容易求解. #include<iostream> ...