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概述 MongoDB是一款开源、高性能、无模式的文档型数据库系统,被广泛应用于Web应用及大数据处理等场景。它采用了BSON(Binary JSON)格式来存储数据,使得数据存储更加灵活高效。 ##### 特点: 1. **...
**Spring框架概述** Spring是一个开源的Java平台,它为创建企业级应用提供了全面的解决方案。Spring的核心特性可以用于任何Java应用程序,但其丰富的模块化结构特别适用于开发Web应用。Spring框架以其轻量级、依赖...
以上只是Java中间件学习笔记的部分概述,实际学习中还需要深入理解每个技术的细节,如故障切换逻辑、数据一致性策略、性能调优等,以应对不同场景的需求。对于Java开发者来说,熟练掌握这些中间件技术,能够提升开发...
1. **MongoDB概述**:解释MongoDB是什么,为什么选择MongoDB(比如JSON文档存储、横向扩展能力等)。 2. **数据模型**:介绍MongoDB如何存储数据,包括文档(BSON格式)、集合、数据库。 3. **查询语言**:讲解...
这份学习笔记涵盖了数据库系统的基础概念、设计原则以及SQL语言的应用。以下是笔记中的关键知识点: 1. **数据库概述**:数据库是一种有组织地存储和管理数据的系统,提供了数据的结构化存储、数据操作和数据控制等...
### Redis 学习笔记知识点概览 #### 一、Redis 简介及特性 - **Redis**(Remote Dictionary Server)是一种开源的、基于内存的数据结构存储系统,它支持多种数据结构,如字符串(strings)、散列(hashes)、列表...
请注意,这里提供的知识点是一个概述,实际的“Pyramid学习笔记3”代码可能涵盖了其中一部分或全部内容,但要完全理解并实现一个功能完备的注册功能,还需要对这些概念有深入的理解,并结合具体代码进行学习。
### Redis 学习笔记知识点概览 #### 一、Redis 概述与应用场景 ##### 1.1 NoSQL 数据库简介 - **定义**: NoSQL(Not Only SQL)泛指非关系型数据库,它们通常不使用传统的表格关系来存储数据。 - **特性**: NoSQL ...
### MySQL开发学习笔记知识点梳理 #### 一、基础知识概述 - **数据库定义**: 数据库(database)是用于存储数据的仓库,它可以高效地存储和处理数据。主要存储介质有两种:磁盘和内存(RAM)。 - **数据库分类**: - *...
所有版本原始概述厌倦了通过电子邮件向自己发送简短的笔记或链接,一旦您关闭手机,您想了解更多信息? 使用 Skratchpad 将它们保存在云端! Backbone 是 Skratchpads 用户界面的核心,大量借鉴了 TodoMVC 应用程序...
这份"Nodejs开发的学习笔记"涵盖了Node.js的基础到高级应用,是学习和掌握Node.js开发的重要参考资料。 一、Node.js基础 1. 安装与环境配置:介绍如何在不同的操作系统(Windows、MacOS、Linux)上安装Node.js,...
在这个压缩包中,你可能发现了"概述"部分,它通常会介绍MongoDB的基本概念,包括它的安装过程、数据模型、数据操作以及基本的查询语法。这是理解任何数据库系统的基础,对于初学者来说尤其重要。 "文章"和"教程...
#### 一、数据库概述 1. **数据存储方式**:数据库是组织、存储和处理数据的一种重要工具。早期的数据存储方式包括文件系统,但是随着数据量的增长,这种简单的方式逐渐暴露出许多问题,如数据冗余、不一致性等。 ...
根据给定的文件信息“免费的数据库学习笔记”、“数据库学习笔记”以及标签“select面试题”,本篇文章将深入探讨与数据库学习相关的知识点,并重点围绕SQL中的SELECT语句进行讲解,包括其基本用法、进阶技巧以及在...
### MySQL数据库学习笔记知识点概述 #### 一、数据库分类及关系型数据库介绍 - **数据库类型**:数据库根据规模和用途可分为大型、中型和小型数据库。此外还有非关系型数据库。 - **大型数据库**:如Oracle和DB2...
学习笔记:在项目开发过程中,我记录了大量的学习笔记和心得体会。这些笔记不仅有助于理解项目的开发过程,还能为学习Python爬虫技术提供宝贵的参考资料。 适用人群: 这份项目合集适用于所有对Python爬虫开发感...
这份“Spring学习笔记”涵盖了Spring框架的核心概念和技术,旨在帮助初学者和经验丰富的开发者深入理解并掌握Spring。以下是对笔记内容的详细概述: 一、Spring框架概述 Spring是一个开源的企业级Java应用框架,它...
### MySQL入门很简单—学习笔记知识点总结 #### 一、数据库概述 **1.1 数据存储方式** - **文件系统**:传统的数据存储方式,通过文件和文件夹组织数据。 - **数据库系统**:通过数据库管理系统(DBMS)进行数据...
### Phalcon 学习笔记知识点概述 #### 一、什么是 Phalcon? Phalcon 是一个用 C 扩展编写的高性能 PHP 框架。它旨在为 Web 开发者提供一个快速且灵活的基础平台来构建现代 Web 应用程序。与传统的 PHP 框架不同,...
### SQL学习笔记,数据库操作详情解析 #### 一、SQL简介与重要性 SQL(Structured Query Language),即结构化查询语言,是一种专为数据库而设计的语言。它被广泛应用于管理和处理存储在关系型数据库管理系统...