MongoDB快速上手
1. MongoDB简介
MongoDB是一个跨平台的基于Key_Value键值对形式保存数据的NoSQL文档类型数据库。
NoSQL(not only sql)数据库,泛指非关系型数据库。
1.1 NoSQL数据库的特点
l 不需要预定义模式
不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。
l 无共享架构
相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
l 弹性可扩展
可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
l 分区
相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
l 异步复制
和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。
l BASE
相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
1.2 NoSql数据库的分类
分类 |
Examples举例 |
典型应用场景 |
数据模型 |
优点 |
缺点 |
键值(key-value) |
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB |
内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 |
Key 指向 Value 的键值对,通常用hash table来实现 |
查找速度快 |
数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 |
Cassandra, HBase, Riak |
分布式的文件系统 |
以列簇式存储,将同一列数据存在一起 |
查找速度快,可扩展性强,更容易进行分布式扩展 |
功能相对局限 |
文档型数据库 |
CouchDB, MongoDb |
Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) |
Key-Value对应的键值对,Value为结构化数据 |
数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 |
查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 |
Neo4J, InfoGrid, Infinite Graph |
社交网络,推荐系统等。专注于构建关系图谱 |
图结构 |
利用图结构相关算法。比如最短路径寻址,N度关系查找等 |
很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。 |
1.3 MongoDB数据库特点
MongoDB数据库有以下特点:
l 跨平台、支持语言众多
l 模式自由
l 支持文件存储
l 易于水平扩展
l 复制集机制
l 多级索引
l 面向集合存储
l 丰富的查询语句
综合以上特点,MongoDB适用于大数据量、高并发、弱事务的互联网应用。
2. MongoDB安装
这里主要介绍在windows平台下的安装(其他平台的安装请到官方下载对应的安装介质)。
2.1 下载安装介质
MongoDB下载地址如下: https://www.mongodb.org/downloads
下载对应的windows平台下的版本。
MongoDBVUE(可视化工具)下载地址:http://www.mongovue.com/downloads/
2.2 安装
下载完成之后,直接点击安装即可。
2.2.1 将MongoDB添加到环境变量
即将MongoDB安装目录的bin目录路径,如下所示:C:\Program Files\MongoDB\Server\3.0\bin
添加到环境变量path中去。要想检测是否添加成功,可以在命令行里,输入Mongo –version查看安装的mongodb的版本号,结果如下图所示:
2.2.2 启动MongoDB
在启动mongodb之前,需要先为其指定对应的Data(即数据存储)目录,log(日志)目录,目录结构如下图所示:
然后在命令行里输入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log –logappend
该命令主要是为mongodb指定了数据存储目录和日志目录,在浏览器里输入:
看到如下内容,即表明服务已经启动了:
It looks like you are trying to access MongoDB over HTTP on the native driver port.
如果该命令窗口关闭,则该数据库服务就停止了。但是这样有一个问题,每次开启服务的时候,都需要输入这行命令,会很费事。我们有两种方式去解决这个问题,如下:
l 将以上的命令保存为一个bat文件,每次启动服务的时候点击即可(即上图中所示的Start文件)
l 将MongoDB添加到服务中去,以服务的形式启动,如下所示:
在命令行中输入以下命令:
C:\WINDOWS\system32>mongod --dbpath D:\MangoDB\Data --logpath D:\MangoDB\Log\mongodb.log --install --serviceName "MongoDB"
在命令行里输入:net start MongoDB
结果如下:
输入:net stop MongoDB,停止服务。
3. MongoDB数据模型
MongoDB是面向集合存储的文档型数据库,其基本概念与常用的关系型数据库有所不同。
3.1 文档
文档是MongoDB最核心的的概念,本质上是一种类JSON的BJSON格式的数据。
BSON是在JSON的基础上加入了一些新的数据类型,包括日期、int32,int64等。
BSON是由键值对组成,具有轻量性、可遍历、高效性三个特性。
3.2 集合
将一组相关的文档放到一起就组成了集合。
文档相当于关系数据库中的一条信息,集合就相当于关系型数据库中的表。
3.3 数据库
多个文档组成集合,多个集合组成数据库。一个MongoDB示例可以承载多个数据库,每个数据库都有独立的权限。
3.4数据类型
3.4.1 基本数据类型
Null: 空值或不存在的字段
布尔:true或false
数值类型:只支持int32,int64,double
字符串:
二进制数据:可以保存由任意字节组成的字符串
正则表达式:主要用于查询。
例如:{name:/olive/},name字段包含olive
{name:/olive/i},name字段包含olive,且不区分大小写
{name:/^olive/i},name字段以olive开头,且不区分大小写
Js代码
3.4.2 Date日期
Mongodb中日期是一个64位的整数
Mongodb存储时间时,先转化为utc时间。
3.4.3 Timestamp
Timestamp只供mongodb内部使用,用于记录操作的详细时间,跟date类型没有关系
3.4.4 Objectid
Objectid由24个十六进制字符构成,每个字节存储两位十六进制数字,总共需要12字节存储空间。
3.4.5 内嵌文档
文档作为键的值,称之为内嵌文档。内嵌文档使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
示例:
User={“name”:”olive”,”address”:{“province”:”henan”,”city”:”zhengzhou”}}
4. MongoDB数据更新
这里的示例主要是使用python语言来进行演示。
引入MongoDB对应的Python的驱动,首先安装pymongo包,在命令行里输入:pip install pymongo。安装完成之后在代码里引用。
创建数据库的链接:
# -*- conding:utf-8 -*-
import pymongo
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
conn = pymongo.MongoClient('localhost', 27017)
db = conn.MDB//创建MDB数据库
dt = db.users//创建users数据表
创建完成之后,可以打开MongoVue查看已创建的数据库、数据表如下图所示:
4.1 数据插入
4.1.1 insert
Insert函数只能作用于一个集合,如果该集合不存在,则数据库服务会自动创建。插入时如果没有指定_id的字段,则自动添加该字段。
#insert
user0 = { 'name':'Olive','sex':'male', 'age':21 }
dt.insert(user0)
user1 = { 'name':'Tom','sex':'Female', 'age':24 }
dt.insert(user1)
user2 = { 'name':'Jack','sex':'male', 'age':25 }
dt.insert(user2)
user3 = { 'name':'Kite','sex':'male', 'age':20 }
dt.insert(user3)
在MongoVUE查看已插入的数据,如下图所示:
除此之外,也可以给insert方法传入一个list参数,如下:
dt.insert([{'name':'Kobe','age':37},{'name':'Jim','age':30}])
再次查看MongoVUE,如下图所示(新增2条数据):
4.1.2 insert_many()
如果要大批量的插入数据也可以使用insert_many()方法,使用如下:
users = [{'name': 'Olive'+str(i)} for i in xrange(101)]
dt.insert_many(users)
4.2 数据更新
修改聚集内的记录:
dt.update(
filter, update_field, upsert, multi )
filter : update的查询条件
update_field:要更新的字段、更新值(类似于sql语句中的set)
upsert:如果不存在update的记录,true为插入,false为不插入,默认为false
muti:查出多条数据,如果为true则更新所有数据,默认为false只更新一条数据
dt.update({'name':'Olive'},{'$set':{'age':100}})
$set:更新指定字段值
用法:{ $set : { field : value } }
$unset:删除指定字段
用法:{ $unset : { field : 1} }
$inc:更新指定字段的值,对指定的字段+value
用法:{ $inc : { field : value }
4.3
数据删除
5. MongoDB数据查询
5.1 find()
5.1.1 默认无参数或者find({})则查询所有数据。
Find({},{})
第一个{} 放where条件
第二个{} 指定那些列显示和不显示 (0表示不显示 1表示显示)
5.1.2 带有参数的查询
user = dt.find({'name':'Olive'})
结果如下图:
5.1.3 查询运算符使用(and 查询):$lt, $lte, $gt, $gte ,$ne
user = dt.find({'name':'Olive','age':{'$lt':90}})
5.1.4 or查询
user =dt.find({'$or':[{'name':'Olive'},{'age':{'$lt':50}}]})
5.1.5 查询内嵌文档的某个字段(需要使用.号操作符):
先插入一条有内嵌字段的文档
dt.insert_one({'name': '111','address':{'princience':'Beijing','city':'Beijing'}})
示例如下:
user = dt.find({'address.city':'Beijing'})
5.1.6 in(nin)
查询
user =dt.find({'name':{'$in':['Olive','Tom','Jack']}})
user =dt.find({'name':{'$nin':['Olive','Tom','Jack']}})
5.1.7 对查询的结果进行排序:
user = dt.find().sort('name',pymongo.ASCENDING)//单个字段
user = dt.find().sort([('name',pymongo.ASCENDING),('age',pymongo.DESCENDING)])//多个字段
5.1.8 like查询(mongodb支持正则表达式/XXX/ /^XXX/以XXX开头)
user =
dt.find({"name": /"Olive"/})
5.2 find_one()
只查找一条信息。
示例:
user =
dt.find_one({'name':'Olive'})
print user['name']
结果如下:
“Olive”
关于一篇mongodb的快速上手的文章,写到这里基本上就结束了,希望能够希望快速上手mongodb的朋友以帮助。这篇文章的示例都是用python+mongodb写的,当然mongodb官方还有对其他语言的适配,这里只是为了方便演示。有兴趣的朋友可以去mongodb的官网去看一下,以便进一步的研究。
MongoDB快速上手的更多相关文章
- java架构之路-(NoSql专题)MongoDB快速上手
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL".在现代的计算系统上每天网络上都会产生庞大的数据量.这些数据有很大一部分是由关系数据库管理系统(RD ...
- 【技术文章】《快速上手nodejs》
本文地址:http://www.cnblogs.com/aiweixiao/p/8294814.html 原文地址: 扫码关注微信公众号 1.写在前面 nodejs快速上手 nodejs使ja ...
- Spring Boot 揭秘与实战(一) 快速上手
文章目录 1. 简介 1.1. 什么是Spring Boot 1.2. 为什么选择Spring Boot 2. 相关知识 2.1. Spring Boot的spring-boot-starter 2. ...
- python对接常用数据库,快速上手!
python对接常用数据库,快速上手! 很多同学在使用python进行自动化测试的时候,会涉及到数据库数据校验的问题,因为不知道如何在python中如何对数据库,这个时候会一脸茫然,今天在这里给大家汇 ...
- 【Python五篇慢慢弹】快速上手学python
快速上手学python 作者:白宁超 2016年10月4日19:59:39 摘要:python语言俨然不算新技术,七八年前甚至更早已有很多人研习,只是没有现在流行罢了.之所以当下如此盛行,我想肯定是多 ...
- 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)
今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...
- 快速上手Unity原生Json库
现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的J ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
随机推荐
- 使用mvn插件执行工程单元测试OOM的解决办法
在执行mvn test时,maven会启动一个fork进程来运行所有的单元测试类,所以我需要设置的是这个fork进程的jvm参数. 不过最终还是让我找到了http://maven.apache.org ...
- python的基础类源码解析——collection类
1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 ################################### ...
- C#完成最简单的WebService创建及使用
打开Visual Studio(我用的是2010)→文件→新建→项目→Visual C#→Web→ASP.NET Web 服务应用程序 打开Service1.asmx文件,会看到里面已经有个Hello ...
- CPU的高速缓存存储器知识整理
基于缓存的存储器层次结构 基于缓存的存储器层次结构行之有效,是因为较慢的存储设备比较快的存储设备更便宜,还因为程序往往展示局部性: 时间局部性:被引用过一次的存储器的位置很可能在不远的将来被再次引用. ...
- Spring 事务管理 01 ——
目录: 参考: 1.Spring 事务管理高级应用难点剖析: 第 1 部分
- pthread_mutex_lock
pthread_mutex_lock pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mut ...
- movebase导航
利用turtlebot 的导航配置文件 由于movbase发的速度太不友好了所以使用了ros自带的滤波安装相应的包 apt-get install ros-indigo-yocs-velocity-s ...
- Java设计模式系列2--工厂方法模式(Factory Method)
2014-02-26 09:56:45 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式分为三种: 1. 普通工厂模式 建立一个工厂类,对 ...
- Android 源码下载
一直想尝试android源码的编译,这两天正好海思代码的编译也需要ubuntu环境,于是安装了ubuntu 12.04,安装时选了语言为中文,因此下面很多状态及错误报告都是中文了,另外分配了4G sw ...
- K2BPM怎么让金融数据更有意义?
西南证券成立于1999年,是唯一一家注册地在重庆的全国综合性证券公司,也是中国第九家上市证券公司和重庆第一家上市金融机构.公司现有员工逾2000名,在全国27个省份获批设立109家证券营业部,拥有17 ...