论坛首页 综合技术论坛

mongoDB简介

浏览 15021 次
锁定老帖子 主题:mongoDB简介
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-25  

 

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
   发表时间:2011-03-25  
mongodb在java中的调用方式怎么看怎么别扭,不解决这个问题,mongodb的可用性就不太高。
mongodb天然和脚本语言好融合,因为闭包、map语法。
前段时候看到有人说直接用node.js,真是太前卫了,呵呵,不过我担心mongodb的可维护性不够好,周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑,真要像foursquare那样有官方团队帮忙技术支持才行。
所以,这东西还真是要慎重慎重。
0 请登录后投票
   发表时间:2011-04-01   最后修改: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舒服太多了。
0 请登录后投票
   发表时间: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讲了不少,很有参考意义。
0 请登录后投票
   发表时间: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编程带来的思想转换一样。
0 请登录后投票
   发表时间: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、备份、迁移的问题。



0 请登录后投票
   发表时间:2011-04-15  
正在用mongodb 尝试做项目。。。希望能成功!
0 请登录后投票
   发表时间:2011-10-11  
周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑!!!!有没有可视化管理工具啊?数据保存进去了,总想用可视化工具看一下....
0 请登录后投票
   发表时间:2011-10-12  
hngmduyi 写道
周边查询和管理工具不成熟。mysql要出点问题我们都知道怎么解决,mongodb要出问题那真是两眼一抹黑!!!!有没有可视化管理工具啊?数据保存进去了,总想用可视化工具看一下....


有可视化工具,但功能很弱。mongovue。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics