`
ldd600
  • 浏览: 103802 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
47bb354f-8b5f-3ea6-a206-c7ead38c741c
Hyperic插件开发不完...
浏览量:11273
社区版块
存档分类
最新评论

mongoDB简介

阅读更多

 

1 页:

 

MongoDB Coming

2 页:大纲

大纲

简介

Why Mongo

Mongo 特性

Mongo 用法

Mongo 架构

MysqlMongo

Mongo java

Java DSL

3 页:简介

简介

MongoDB不是在实验室设计出来的。利用自己开发大型,高可用性和健壮性系统的经验,我们开发了MongoDB。我们并不是从零开始,而是发现 哪些地方有问题,然后尝试解决它。所以在我眼中,MongoDB让你从使用MySQL的基于关系的数据模型转变为基于文档的模型,从而获得如快速的嵌入式 文档,易管理,使用无模式数据库进行敏捷开发,易于横向扩展和伸缩(因为join不再重要)等大量特性。使用关系型数据时有很多东西工作的很好,比如索 引,动态查询和动态更新等,这些在MongoDB中也没怎么变化。比如,在MongoDB里设计索引应该和你在MySQLOracle里一样,你有选择 在一个内嵌的域上建索引的能力。

    – Eliot Horowitz, 10gen公司首席技术官和联合创始人

4 页:Why Mongo

Why Mongo

面向文档

文档(对象)和编程语言的数据类型很好的对应

嵌入式文档和数组减少了join的必要

动态类型(无schema)使模式演变非常容易

没有join和多文档事务从而获得高性能和易伸缩性

高性能

没有join和事务使得读写操作很快

可以索引嵌入式文档和数组

可选的异步写操作

高可用性

复制服务器自动和主节点故障转移

易伸缩

最终一致性读操作分布到复制服务器上

自动分片(数据跨服务器自动分区)

读写操作分布在不同的分片上

没有join和事物使得分布式查询简单而高效

富查询语言

存储的JavaScript

Aggregation:支持Map Reduce模型

限长集合

大文件,大数据量存储引擎

管理简单

5 页:Who Use

Who Use

http://www.mongodb.org/display/DOCS/Production+Deployments

6 页:Mongo 用法—文档

Mongo 用法文档

文档是MongoDB的基本存储单元

BSON

{"greeting" : "Hello, world!", "greeting" : "Hello, MongoDB!"}

每个文档都会有一个特殊的key, "_id",

7 页:Mongo 用法—Collection

Mongo 用法—Collection

集合可以看成是关系数据库的表,但是是没有schema限制的。

    {"greeting" : "Hello, world!"}

    {"foo" : 5}

命名:UTF-8,不能是“”,不能含有\0$system打头的集合是系统集合。如blog.posts

那我们只需要一个集合就够了吗?不够

程序开发起来很复杂

速度慢:会扫描很多无关的document

索引

使用时也需要按业务划分

8 页:Subcollections

Subcollections

blog.postsblog.authors,两者没关系,并且和blog也没关系

便于组织管理,Web Console

9 页:Database

Database

MongoDB多数据库

数据库用来归类Collection

Database是相互独立的,独立的文件存储

命名:Collection规则,小写,最长64字节

10 页:Mongo Shell

Mongo Shell

JavaScript shellshell执行命令的地方

插入:db.foo.insert({"bar" : "baz"})

批量插入:性能

删除:db.mailing.list.remove({"opt-out" : true})

更新: var joe = db.users.findOne({"name" : "joe"});

     joe.relationships = {"friends" : joe.friends, "enemies" : joe.enemies};

    {

    "friends" : 32,

    "enemies" : 2

     }

    db.users.update({"name" : "joe"}, joe)

 

Upsert

查询:db.people.find()

    db.people.findOne({"name" : "joe", "age" : 20});

11 页:数据类型

数据类型

Null{"x" : null}

Boolean{"x" : true}

32-bit Integer

64-bit 浮点数:{"x" : 3.14}

String

object id12-byte ID

Datemilliseconds,无TimeZone javaString

regular expression{"x" : /foobar/i}

Codejavascript code {"x" : function() { /* ... */ }}

binary data String bytes

maximum value

minimum value

Undefined{"x" : undefined}

Array{"x" : ["a", "b", "c"]}

embedded document{"x" : {"foo" : "bar"}}

12 页:Modifiers(原子操作)

Modifiers(原子操作)

$set{ $set : { field : value } }

$unset :删除,{ $unset : { field : 1} }

$inc { $inc : { field : value } }

$push

$pushAll { $pushAll : { field : value_array } }

$pull{ $pull : { field : _value } }

$pullAll

$addToSet:不存在则添加。

$pop:删除数组的第一个或最后一个元素。{ $pop : { field : 1 } }

$rename{ $rename : { old_field_name : new_field_name } }

$bit – 位操作,integer类型。{$bit : { field : {and : 5}}}

$ 偏移操作符:

> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }

> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true )

> t.find() { "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }

13 页:索引

索引

创建:

db.status.ensureIndex({user : 1, date : -1})

Unique

db.people.ensureIndex({"username" : 1}, {"unique" : true})

Compound Indexes

db.things.ensureIndex({j:1, name:-1});

db.foo.find().explain()

db.people.ensureIndex({“username” : 1}, {“background” : true})backgroud:非阻塞,后台创建

db.collection.dropIndex({x: 1, y: -1})

14 页:Query language

Query language

查询条件

<, <=, >, >=

$all

$exists

$mod

$ne

$in

$nin

$nor

$or

$size

$type

$elemMatch

正则

$not

Cursor方法

count()

limit()

skip()

snapshot()

sort()

Group()

例子:

db.users.find( { x : 3, y : "abc" } ).sort({x:1});

db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})

15 页:Mongo 架构

Mongo 架构

复制:master-slavereplica set,自动恢复

和主库最一致的从库会自动替代成为主库,这都是简单的配置就可做到的。




 

 

 

16 页:Mongo 架构

Mongo 架构

分区:Autoshard,加减机器如此简单,再也不蛋疼。

Mongos:路由程序

Mongod:服务器端程序

 


 

 


17 页:备份

备份

热备份:

mongodump mongorestore

Fsync

Slave Backups

Repair:修复,同时会压缩数据

18 页:监控

监控

Web admin

Mongostat

ServerStatus command

19 页:安全

安全

用户名,密码

用户分为普通用户,管理员

IP限制

20 页:MysqlMongo

MysqlMongo

Mysql分表

Mysql分库

Mysql schema

Mysql master-slave 主从切换

迁移方法:用jackson mapperjsonDB查询成Map

21 页:Mongo java

Mongo java

连接

Mongo m = new Mongo( "localhost" , 27017 );

DB db = m.getDB( "mydb" );

获取集合

DBCollection coll = db.getCollection("testCollection")

查询

query = new BasicDBObject();

query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30)); // i.e. 20 < i <= 30

 cur = coll.find(query);

while(cur.hasNext()) { System.out.println(cur.next()); }

Insert

BasicDBObject doc = new BasicDBObject();

doc.put("name", "MongoDB");

doc.put("type", "database");

doc.put("count", 1);

BasicDBObject info = new BasicDBObject(); I

nfo.put("x", 203); info.put("y", 102);

doc.put("info", info);

coll.insert(doc);

22 页:Mongo USE CASES

Mongo USE CASES

Blog

UGC 数据

GridFS存储图片和缩略图

23 页:体会

体会

爱内存

爱索引

爱原子操作

批量插入,异步写入

Java 驱动限制,需要很好的封装

开发效率低

性能貌似不错

24 页:Java DSL

Java dsl

Group

Shard环境不能使用,需要用map reduce模型替代

db.coll.group( {key: { a:true, b:true }, cond: { active:1 }, reduce: function(obj,prev) { prev.csum += obj.c; }, initial: { csum: 0 } });

key: Fields to group by.

reduce

keyf

cond

finalize:

 

java程序员写起来超级崩溃。

25 页:Group 例子

Group 例子

db.test.group(

{ cond: {"invoked_at.d": {$gte: "2009-11", $lt: "2009-12"}} ,

key: {http_action: true} ,

initial: {count: 0, total_time:0} ,

 reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time } ,

 finalize: function(out){ out.avg_time = out.total_time / out.count } } );

26 页:查询框架

Java驱动封装,面向对象的DSL查询框架。不用java开发人员写js代码。

 

public enum Criteria {

    //select 使用PropertyCriteria作为查询条件

    select(CriteriaType.select),

    unselect(CriteriaType.select),

    //group by 使用PropertyCriteria作为查询条件

    groupBy(CriteriaType.groupBy),

    //order by 使用PropertyCriteria作为查询条件

    asc(CriteriaType.orderBy),

    desc(CriteriaType.orderBy),

    //where 使用CriteriaValue作为查询条件

    gt(CriteriaType.where),

    lt(CriteriaType.where),

    eq(CriteriaType.where),

    ne(CriteriaType.where),

    gte(CriteriaType.where),

    lte(CriteriaType.where),

    in(CriteriaType.where),

    //组函数 使用PropertyCriteriaCriteriaValue作为查询条件

   //(当作使用CriteriaValue时,带的值为函数返回值的keynamePropertyCriteriakeynamepropname_functionname

    max(CriteriaType.groupFunction),

    min(CriteriaType.groupFunction),

    /**

     * 暂时不支持,可以用sum除以count代替

     */

    avg(CriteriaType.groupFunction),

    sum(CriteriaType.groupFunction),

    count(CriteriaType.groupFunction),

    //多列组函数 使用PropertyCriteriaCriteriaValue作为查询条件

    //类似groupFunction,但是prop的值是用逗号多个字段名称的stringCriteriaValue的值也是返回值key的逗号拼接

    /**

     * 取最大值,并带出最大值时的其他属性

     */

    maxRow(CriteriaType.multiGroupFunction),

    /**

     * 取最小值,并带出当最小值时的其他属性

     */

    minRow(CriteriaType.multiGroupFunction),

    ;

    public final CriteriaType type;

   

    private Criteria(CriteriaType type) {

        this.type = type;

    }

}

 

 

 

  • 大小: 56 KB
  • 大小: 4.7 KB
分享到:
评论
8 楼 ldd600 2011-09-05  
tedeyang 写道
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。


确实遇到很多问题,用了才知道。
1.单机稳定性
2.group by限制
3.内存胃口太大,需要单独部署
4.定期repair database
等。。。。
7 楼 liliang_xf 2011-09-05  
请问这是那本mongodb的英文书
6 楼 icanfly 2011-04-15  
正在用mongodb 尝试做项目。。。希望能成功!
5 楼 kimmking 2011-04-11  
tedeyang 写道
kimmking 写道
油炸大龙虾 写道
tedeyang 写道
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。



node.js的优势在于,跟jquery与mongodb配合,dev只需要掌握一门语言javascript,相对单一。环境问题相对麻烦一点(可以cygwin),npm也有好几百个了,到使用的时候了。

mongodb掌握起来确实不易,不过惊喜总是有的嘛,就跟09年看肉饼的nosql帖子样,当天晚上就发现mongodb模糊查询可以使用正则 ,比mysql舒服太多了。

mongodb的问题,qcon大会里panfan同学的ppt讲了不少,很有参考意义。

mongodb的最大优势还真是如他自己所说:schemaless。
所以放那些定义可变的、内嵌多层的数据类型很合适。性能也就是和mysql不相上下(都有索引的情况下)
但大部分系统还是需要有强定义的数据格式。
最重要的是:用mongodb是需要转换思想的,就像用ORM与sql编程带来的思想转换一样。

给mongodb加个orm层,或者加个schema机制,也很容易。

orm的有了一个,还不是很成熟,http://code.google.com/p/morphia/
mongodb在我的某个东西里用了下,感觉的几个问题:
1、最大问题:32-bit os的数据限制,这个sucks啊
2、单机性能和数据一致性。幸好存的数据不是业务数据,而只是日志。
3、备份、迁移的问题。



4 楼 tedeyang 2011-04-11  
kimmking 写道
油炸大龙虾 写道
tedeyang 写道
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。



node.js的优势在于,跟jquery与mongodb配合,dev只需要掌握一门语言javascript,相对单一。环境问题相对麻烦一点(可以cygwin),npm也有好几百个了,到使用的时候了。

mongodb掌握起来确实不易,不过惊喜总是有的嘛,就跟09年看肉饼的nosql帖子样,当天晚上就发现mongodb模糊查询可以使用正则 ,比mysql舒服太多了。

mongodb的问题,qcon大会里panfan同学的ppt讲了不少,很有参考意义。

mongodb的最大优势还真是如他自己所说:schemaless。
所以放那些定义可变的、内嵌多层的数据类型很合适。性能也就是和mysql不相上下(都有索引的情况下)
但大部分系统还是需要有强定义的数据格式。
最重要的是:用mongodb是需要转换思想的,就像用ORM与sql编程带来的思想转换一样。
3 楼 kimmking 2011-04-10  
油炸大龙虾 写道
tedeyang 写道
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。



node.js的优势在于,跟jquery与mongodb配合,dev只需要掌握一门语言javascript,相对单一。环境问题相对麻烦一点(可以cygwin),npm也有好几百个了,到使用的时候了。

mongodb掌握起来确实不易,不过惊喜总是有的嘛,就跟09年看肉饼的nosql帖子样,当天晚上就发现mongodb模糊查询可以使用正则 ,比mysql舒服太多了。

mongodb的问题,qcon大会里panfan同学的ppt讲了不少,很有参考意义。
2 楼 油炸大龙虾 2011-04-01  
tedeyang 写道
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。



node.js的优势在于,跟jquery与mongodb配合,dev只需要掌握一门语言javascript,相对单一。环境问题相对麻烦一点(可以cygwin),npm也有好几百个了,到使用的时候了。

mongodb掌握起来确实不易,不过惊喜总是有的嘛,就跟09年看肉饼的nosql帖子样,当天晚上就发现mongodb模糊查询可以使用正则 ,比mysql舒服太多了。
1 楼 tedeyang 2011-03-25  
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。

相关推荐

    mongoDB简介.doc

    ### MongoDB简介 MongoDB是一种介于关系数据库和非关系数据库之间的产品,在非关系数据库中以其丰富的功能和接近关系数据库的特性而闻名。它支持类似JSON的BSON格式数据存储,适用于存储复杂的数据类型。 #### ...

    MongoDB简介及精进PDF

    在这个"MongoDB简介及精进PDF"的压缩包中,包含了对MongoDB的深度探讨,包括其基本概念、核心特性、最佳实践以及高级技术应用。 NOSQL主流产品的研究报告.docx可能涵盖了当前市场上流行的NoSQL数据库的比较,包括...

    MongoDB简介与实践

    ### MongoDB简介与实践 #### MongoDB概述 MongoDB是一款先进的、基于分布式文件存储的数据库系统,其核心编程语言为C++。这款数据库系统的设计初衷是为了满足Web应用对高性能、可扩展数据存储方案的需求。MongoDB...

    MongoDB简介(软件测试)

    MongoDB简介 软件测试

    mongodb-introduction:MongoDB简介

    在Cherryleer创建的这个MongoDB简介中,你将学习到如何开始使用MongoDB,从安装、基本操作到高级特性,为你的项目提供一个强大的非关系型数据库解决方案。通过JavaScript与MongoDB的紧密集成,你可以更加高效地管理...

    MongoDB简介与实践.pdf

    从提供的文件内容中,我们可以提取出以下关于MongoDB的知识点: 1. 关于NoSQL的知识点: NoSQL数据库是区别于传统关系型数据库的数据存储方式,它主要面对数据高并发性的实时读取与写入、海量数据存储和智能计算与...

    MongoDB简介习题.pdf

    MongoDB 是一个广泛使用的开源数据库系统,尤其在处理大量非结构化数据时表现出色。它是用 C++ 语言编写的,具有分布式文件存储的特性,适合于构建高度可扩展的应用程序。MongoDB 的设计目标是提供高性能、高可用性...

    MongoDB简介与实践.zip

    MongoDB是一种流行的开源、分布式文档型数据库,设计用于处理海量数据并提供高可用性和可扩展性。它采用了NoSQL的数据模型,与传统的SQL关系数据库相比,具有更灵活的数据结构和更高的写入性能。MongoDB使用BSON...

    Mongodb for Ubuntu 18.04 ARM 64

    二、MongoDB简介 MongoDB是一个NoSQL数据库,它使用JSON-like文档进行数据存储,这使得处理复杂数据结构变得简单。它的特点是灵活性、高可用性、可扩展性和高性能,适用于大数据和实时应用。 三、安装MongoDB 1. ...

    Spring-Data-MongoDB3.2

    Spring Data MongoDB简介** Spring Data MongoDB提供了与MongoDB数据库交互的一系列抽象,包括MongoTemplate和Repository接口。通过这些接口,开发人员无需直接编写MongoDB的Java驱动程序代码,就能实现CRUD(创建...

    掌握MongoDB:NoSQL数据库基础与高级特性教程.rar

    MongoDB 简介 MongoDB 特点 安装与配置 安装 MongoDB 启动与配置 MongoDB 基本操作 数据库和集合 文档操作 查询操作 基本查询 高级查询 索引与性能优化 创建索引 索引类型 索引优化 聚合操作 聚合框架 常用聚合操作 ...

    7_webstorm配置mongodb1

    MongoDB简介 MongoDB是一款面向文档的NoSQL数据库,使用BSON(Binary Serialized Object Notation)存储数据。它具有高性能、高可用性和可扩展性,常用于大数据分析、实时分析、机器学习和人工智能等领域。 ...

    mongodb启动加入windows服务

    #### 一、MongoDB简介 MongoDB是一种非常流行的开源文档数据库系统,它属于NoSQL(非关系型数据库)的一种。与传统的关系型数据库不同,MongoDB采用BSON(Binary JSON)格式存储数据,这使得数据存储更加灵活,并且...

    spring mongodb 中文文档

    1. **MongoDB 简介** MongoDB 是一个NoSQL 数据库,使用JSON 样式的文档存储数据,适合处理大规模数据。其特点包括高可用性、可扩展性和灵活性。 2. **Spring Data MongoDB 概述** Spring Data MongoDB 提供了一...

    Mongodb视频-燕十八 mongodb视频教程全集21讲+mongodb高级实战开发视频教程

    ### MongoDB简介 MongoDB是一种源代码开放的、跨平台的NoSQL数据库系统,它采用BSON(Binary JSON)格式存储文档数据。与传统的关系型数据库不同,MongoDB通过灵活的数据模型和高效的查询语言,为大规模数据存储和...

    graphql-mongo:GraphQL + MongoDB简介

    GraphQL + MongoDB简介实现GraphQL与MongoDB通信的示例应用程序。目录Basic 测试程序,可以使用GraphQL从MongoDB检索数据/向MongoDB添加数据/从MongoDB除去数据,并从终端运行。 Express 运行Express-GraphQL API...

Global site tag (gtag.js) - Google Analytics