【MongoDB学习笔记五】MongoDB概述

MongoDB是面向文档的NoSQL数据库,尽量业界还对MongoDB存在一些质疑的声音,比如性能尤其是查询性能、数据一致性的支持没有想象的那么好,但是MongoDB用户群确实已经够多。MongoDB的亮点不在于它的性能,而是它处理非结构化数据的能力以及内置对分布式的支持(复制、分片达到的高可用、高可伸缩),同时它提供的近似于SQL的查询能力,也是在做NoSQL技术选型时,考虑的一个重要因素。MongoDB的目前实现已经非常接近了关系型数据库提供的特性(除了事务性支持)

 

MongoDB的技术特点

  • 面向文档的存储引擎,可以方便支持非结构化数据
  • 全面的索引支持,可以在任意属性上建立索引
  • 数据库本身内置的复制与高可用
  • 数据库本身支持的自动分片集群
  • 丰富的基于文档的查询功能(提供了接近SQL语句的查询能力,但是不支持join查询)
  • 原子化的数据操作(对一个文档的操作是原子的,体现了某种事务性,但是跨文档的操作不是原子操作)
  • 聚合操作支持(类比SQL的group by实现分组统计功能)
  • 支持Map/Reduce(聚合操作支持)
  • GridFS (提升分布式环境下的读写性能)

何为非结构化数据

 

SQL,结构化数据查询语言,如同SQL的名称所指明的,关系型数据库处理的是结构化数据。何为结构化数据?从关系型数据的角度上通俗的说,就是可以把数据分解成多个关系(或者称为表,表的每一列都是单一的数据值),这就要求存放在一个关系中的数据具有确定的字段名称,字段类型以及把所有可能的字段都要完全一样。但是,现实中的数据很多并不是结构化的,比如调查表,对不同的人进行调查,它的问卷题目可能完全不一样。对调查表进行建模,很难使用一个关系来准确的进行描述。对于SQL来说,很有可能需要针对不同种类的调查对象创建不同的表,这种建模方式,不必多说,太ugly了。

 

对于MongoDB,它是无模式的。无模式指的是集合(类比SQL的表)中的文档(类比SQL的记录行)不要求包含一致的字段(类比SQL表的列或者域),每个字段也不要求SQL限定的值的单一性。只要语义上符合逻辑,任意结构的数据都可以保存为一个文档,然后放到同一个集合中。并且,即使某个字段有些文档存在,有些文档不存在,依然可以对这个字段建立索引。

这样,即使字段完全不同的两个调查表也可以放到同一个集合中。

 

MongoDB的文档数据结构

  • MongoDB的文档的格式想象成JSON即可(事实上,MongoDB内部使用的是基于JSON实现的BSON),JSON的Key就是字段名,Value就是字段的值。由于Value的值可以是另外一个JSON,这样的Value称为为嵌套的文档。这种数据模型很多年前Oracle就实现了,只不过它使用的数据结构是用XML来描述的。
  • 嵌套文档实际上实现了SQL的Join效果,同时,相关的数据存放在一个文档中而不是SQL的两个或者多个表中,要查找相关的数据,SQL只能在多个表中做关联查询,效率底下;更糟糕的时,在分布式NoSQL数据库中,相关的数据可能存放在不同的数据库中,进一步降低查询性能。因为MongoDB可以把相关的数据存放在一个文档中,因此,它适合在集群中部署,而无需做跨文档的查询
  • MongoDB的Value是有类型的
  • MongoDB默认为每一个一个文档添加一个字段,字段名为_id,它的值是MongoDB随机生成的,这个字段的类型是ObjectId。ObjectId由12字节(即24个16进制数字)组成,第0-3字节为时间戳,第4-6字节为机器标识(一般是主机名的散列值),第7-8字节是pid,9-11字节是计数器。例如ObjectId("54430dc3aa94a90b12374cdb")
  • MongoDB每个文档的大小上限为16M

 

MongoDB的文档更新操作

文档更新操作有可能是替换操作(用更新操作提供的文档来替换旧文档),也有可能真正的更新操作(更新操作提供的文档中只包含要更新的字段,更新时按照这些字段去更新旧文档对应的文档)。那么MongoDB的文档更新操作究竟是哪一个呢?

 

答:不带修改器$set的update操作是替换,使用了$set的update操作是对指定的键进行操作。详见http://bit1129.iteye.com/blog/2145090

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mongodb)