MongoDB的介绍

简介

  • MongoDB 是一个基于分布式 文件存储的NoSQL数据库
  • 由C++语言编写,运行稳定,性能高
  • 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案
  • 查看官方网站

MongoDB特点

  • 模式自由 :可以把不同结构的文档存储在同一个数据库里
  • 面向集合的存储:适合存储 JSON风格文件的形式
  • 完整的索引支持:对任何属性可索引
  • 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间 的相互复制。复制的主要目的是提供冗余及自动故障转移
  • 自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
  • 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可轻易查询文档中的内嵌的对象及数组
  • 快速就地更新:查询优化器会分析查询表达式,并生成一个高效的查询计划
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)

MongoDB的功能

查询:基于查询对象或者类SQL语句搜索文档. 查询结果可以排序,进行返回大小限制,可以跳过部分结果集,也可以返回文档的一部分.

  • 插入和更新 : 插入新文档,更新已有文档.
  • 索引管理 : 对文档的一个或者多个键(包括子结构)创建索引,删除索引等等
  • 常用命令: 所有MongoDB 操作都可以通过socket传输的DB命令来执行.

MongoDB的局限性与不足

本文来源于对Quora上一个问答的整理,主要列举了MongoDB身上一些局限的功能及目前做得不够好的地方。其中包括了原本就并非MongoDB想做的部分,也包括了MongoDB想做但没做好的方面。

  • 在32位系统上,不支持大于2.5G的数据。
  • 单个文档大小限制为 4 M/16 M(1.8版本后升为16M) 锁粒度太粗,MongoDB使用的是一把全局的读写锁
  • 不支持join操作和事务机制,这个确实是非MongoDB要做的领域
  • 对内存要求比较大,至少要保证热数据(索引,数据及系统其它开销)都能装进内存
  • 用户权限方面比较弱,这一点MongoDB官方推荐的是将机器部署在安全的内网环境中,尽量不要用权限
  • MapReduce在单个实例上无法并行,只有采用Auto-Sharding才能并行。这是由JS引擎的限制造成的
  • MapReduce的结果无法写入到一个被Sharding的Collection中,2.0版本对这个问题的解决好像也不彻底
  • 对于数组型的数据操作不够丰富
  • Auto-Sharding还存在很多问题,所谓的水平扩展也不是那么理想

适用范围

  • 适合实时的插入,更新与查询,并具备应用程序实时数据存储所需的复制及高度伸缩性。

  • 适合作为信息基础设施的持久化缓存层。

  • 适合由数十或数百台服务器组成的数据库。因为Mongo已经包含对MapReduce引擎的内置支持。

  • Mongo的BSON数据格式非常适合文档化格式的存储及查询。
    网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。

  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。

  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。

  • 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询

MongoDB的不适用范围

  • 高度事务性的系统。

  • 传统的商业智能应用。

  • 级为复杂的SQL查询。

  • 高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

  • 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

  • 需要SQL的问题

MongoDB语法与现有关系型数据库SQL语法比较

MongoDB语法                                  MySql语法
db.test.find({'name':'foobar'})<==> select * from test where name='foobar'
db.test.find()                 <==> select *from test
db.test.find({'ID':10}).count()<==> select count(*) from test where ID=10
db.test.find().skip(10).limit(20)<==> select * from test limit 10,20
db.test.find({'ID':{$in:[25,35,45]}})<==> select * from test where ID in (25,35,45)
db.test.find().sort({'ID':-1})  <==> select * from test order by IDdesc
db.test.distinct('name',{'ID':{$lt:20}})  <==> select distinct(name) from testwhere ID<20
db.test.remove({})				<==> delete * from test
db.test.remove({'age':20})		<==> delete test where age=20
db.test.remove({'age':{$lt:20}})<==> elete test where age<20
db.test.remove({'age':{$lte:20}}<==> delete test where age<=20
db.test.remove({'age':{$gt:20}})<==> delete test where age>20
db.test.remove({'age':{$gte:20}})<==> delete test where age>=20
db.test.remove({'age':{$ne:20}}) <==> delete test where age!=20
db.test.group({key:{'name':true},cond:{'name':'foo'},reduce:function(obj,prev){prev.msum+=obj.marks;},initial:{msum:0}})  <==> select name,sum(marks) from testgroup by name
 
db.test.find('this.ID<20',{name:1})  <==> select name from test whereID<20
db.test.insert({'name':'foobar','age':25})<==>insertinto test ('name','age') values('foobar',25)
db.test.update({'name':'foobar'},{$set:{'age':36}})<==> update test set age=36 where name='foobar'
db.test.update({'name':'foobar'},{$inc:{'age':3}})<==> update test set age=age+3 where name='foobar'

总结基本操作

MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成
MongoDB文档类似于JSON对象,字段值可以包含其他文档、数组、文档数组
安装管理mongodb环境
完成数据库、集合的管理
数据的增加、修改、删除、查询

名词
在这里插入图片描述

三元素:数据库,集合,文档

  • 集合就是关系数据库中的表
  • 文档对应着关系数据库中的行

文档:就是一个对象,由键值对构成,是json的扩展Bson形式

{'name':'xiaoming','gender':'男','age':24}

集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中

{'name':'huangzhong','gender':'男'}
{'name':'zhangfei','age':18}
{'book':'sanguoyanyi','state':'3'}

数据库:是一个集合的物理容器,一个数据库中可以包含多个文档
一个服务器通常有多个数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值