`
zuroc
  • 浏览: 1307767 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

couchdb漫游指南

阅读更多

==== 启动 ====
balin couchdb #  ./utils/run
参数有

  -h          display a short help message and exit
  -V          display version information and exit
  -a FILE     add configuration FILE to chain
  -A DIR      add configuration DIR to chain
  -n          reset configuration file chain (including system default)
  -c          print configuration file chain and exit
  -i          use the interactive Erlang shell
  -b          spawn as a background process(作为后台进程)
  -p FILE     set the background PID FILE (overrides system default)
  -r SECONDS  respawn background process after SECONDS (defaults to no respawn)
  -o FILE     redirect background stdout to FILE (defaults to $STDOUT_FILE)
  -e FILE     redirect background stderr to FILE (defaults to $STDERR_FILE)
  -s          display the status of the background process
  -k          kill the background process, will respawn if needed
  -d          shutdown the background process(关闭)


=== 配置 ===
balin couchdb # vi etc/couchdb/local_dev.ini
这里可以指定端口号等
常用的有

[httpd]
port = 12345
bind_address = 0.0.0.0

[admins]
用户名 = 密码

=== 使用 ===
http://123.123.123.123:12345/_utils/
可以创建数据库

===== python 中的使用 =====
http://123.123.123.123:12345/_utils/database.html?python-tests

以操纵这个数据库作为演示,python库有几个函数比如update([...])不能用,不能用用户名密码等等,也许要修一下...

from couchdb import client
from couchdb.client import Document
server = client.Server('http://123.123.123.123:12345/')

#打开数据库
db = server['python-tests']

#创建一条数据
doc_id = db.create({'type': 'Person', 'name': 'John Doe'})

#获取一条数据,这个doc接口和字典一样
doc = db[doc_id]

#_rev是版本,_id是uuid
doc.items()
[(u'_rev', u'1-2963977070'),
(u'_id', u'4a36f238f4facbe08762b1a958cef39e'),
(u'type', u'Person'),
(u'name', u'John Doe')]

#可以自己指定主键
db['JohnDoe'] = {'type': 'person', 'name': 'John Doe'}

db['JohnDoe'].items()
[(u'_rev', u'1-2744716443'),
(u'_id', u'JohnDoe'),
(u'type', u'person'),
(u'name', u'John Doe')]

#更新
badman = db['JohnDoe']
badman[age]=1234
db['JohnDoe'] = badman

#删除,可以用db.delete(doc)来删除
del db['JohnDoe']

#遍历
for row in db.view('_all_docs'):
    print row.id

#看数据库信息
db.info()
{u'compact_running': False,
u'db_name': u'python-tests',
u'disk_size': 24381,
u'doc_count': 13,
u'doc_del_count': 0,
u'instance_start_time': u'1241518867280531',
u'purge_seq': 0,
u'update_seq': 21}


#文档可以有2进制的附件 put_attachment 用这个函数上传

# 查询,map_fun是一个js函数,emit是emit(key,value)。key,value均可是null
# web页面上有Select view查询,可以直接搜索测试
# 好像要用unicode字符 不然找不到 囧啊

db['/logo/xxx1.jpg']={"type":"logo","size":1}
db['/logo/xxx2.jpg']={"type":"logo","size":2}
db['/logo/xxx3.jpg']={"type":"logo","size":3}
db['/logo/xxx4.jpg']={"type":"logo","size":4}


map_fun = u'''
function(doc) {
    if (doc.type=='logo')
        emit(doc._id, doc.size);
}
'''

for row in db.query(map_fun):
    print row
输出
<Row id=u'logo/xxx1.jpg', key=u'logo/xxx1.jpg', value=1>
<Row id=u'logo/xxx2.jpg', key=u'logo/xxx2.jpg', value=2>
<Row id=u'logo/xxx3.jpg', key=u'logo/xxx3.jpg', value=3>
<Row id=u'logo/xxx4.jpg', key=u'logo/xxx4.jpg', value=4>


我们还可以加上reduce函数
比如

reduce_fun = u'''
function(keys, values, rereduce) {
    return sum(values)
}
'''
for row in db.query(map_fun,reduce_fun):
    print row
输出
<Row key=None, value=10>

reduce 中 rereduce变量的含义如下

   1. rereduce为false

        * key为array,element为:[key,id],key为map function产生的key,id为Document对应id
        * values为array,elements为map function产生的结果
        * 比如 reduce([ [key1,id1], [key2,id2], [key3,id3] ], [value1,value2,value3], false)

   2. rereduce为true

        * key为null
        * values为array,element为前一次reduce返回的结果
        * 比如reduce(null, [中间结果1,中间结果2,中间结果3], true)


这里有一些map/reduce演示的例子,比较好懂
http://labs.mudynamics.com/wp-content/uploads/2009/04/icouch.html  

==== Creating Views ====

View 可以理解为索引了 不过这个索引不是实时的...

接着上文的例子

db["_design/test"]={
  "views":
  {
    "all": {
      "map": "function(doc) { if (doc.type == 'logo')  emit(null, doc) }"
    },
    "size_large_than_2": {
      "map": "function(doc) { if (doc.size && parseInt(doc.size)>2)  emit(null,doc) }"
    },
    "total_size": {
      "map": "function(doc) { emit(null,parseInt(doc.size)) }",
      "reduce": "function(keys,values) { return sum(values) }"
    }
  }
}

然后刷新
http://123.123.123.123:12345/_utils/database.html?python-tests

可以看到 select views中多了test


也可访问
http://123.123.123.123:12345/python-tests/_design/test/_view/all
可以加上limit这一类参数
http://123.123.123.123:12345/python-tests/_design/test/_view/all?limit=2
点着看看
http://123.123.123.123:12345/python-tests/_design/test/_view/all?limit=2&skip=1
这样可以做分页,不过(http://stackoverflow.com/questions/312163/pagination-in-couchdb)
"""A simpler method of doing this is to use the skip parameter to work
out the starting document for the page, however this method should be
used with caution. The skip \parameter simply causes the internal
engine to not return entries that it is iterating over. While this
gives the desired behaviour it is much slower than finding the first
document for the page by key. The more documents that are skipped, the
slower the request will be."""
所以最好配合下面的startkey之类的来用skip

类似参数还有

排序 descending=false
开始结束 startkey="abc"&endkey="abcZZZZZZZZZ"
可以用docid startkey_docid=null

group=true 用法有的复杂 看这里,是用来合并的结果的
http://jchrisa.net/drl/_design/sofa/_show/post/markov_chains_using_couchdb_s_g

key可以的复杂的key比如
The query startkey=["foo"]&endkey=["foo",{}] will match most array
keys with "foo" in the first element, such as ["foo","bar"] and
["foo",["bar","baz"]]. However it will not match
["foo",{"an":"object"}]

点着看看

python中可以这样访问

for row in db.view('_design/test/_view/all'):
    print row.id

输出
logo/xxx1.jpg
logo/xxx2.jpg
logo/xxx3.jpg
logo/xxx4.jpg

又如
for row in db.view('_design/test/_view/size_large_than_2'):
    print row

<Row id=u'logo/xxx3.jpg', key=None, value={u'_rev': u'1-3347158087', u'_id': u'logo/xxx3.jpg', u'type': u'logo', u'size': 3}>
<Row id=u'logo/xxx4.jpg', key=None, value={u'_rev': u'1-1107796651', u'_id': u'logo/xxx4.jpg', u'type': u'logo', u'size': 4}>


==== 网络资源 ====

这里有一篇中文的简介,可以看看作为背景知识
http://hi.baidu.com/freeway2000/blog/item/8f76ed11f26bc8c1a6ef3f53.html

CouchDB: The Definitive Guide
http://books.couchdb.org/relax/


=== 注 ===
1.
couchdb 根据网上的测试表明
写入速度 比 mysql 慢4倍
创建索引速度 比 mysql 慢50倍

2.
couchdb 只写入不删除
需要定期做整理
类似垃圾回收的copy+删除
需要预留大量磁盘空间

3.
索引不是实时的
你可能看到的是旧的数据

我的个人看法:
单单看性能,couchdb的确很不理想
但是couchdb可以把数据以view的方式展现,要什么,就新建什么样的view
这种随心所欲索引方式,在不少应用的场合,
通过view的方式把这种查询结果持久化,
可以大大减少了把传统意义上的重复且相似查询.


举一个例子,
比如好友广播,
每一个人创建一个view,
也许可以吧...

0
1
分享到:
评论
2 楼 JeffreyHsu 2009-07-27  
速度太慢了,令人发指,而且不能排序

新鲜玩意,完全不可以实际应用
1 楼 Arbow 2009-05-06  
引用
couchdb 根据网上的测试表明
写入速度 比 mysql 慢4倍
创建索引速度 比 mysql 慢50倍


确实挺慢的,也许是速度原因阻碍了国内的发展,感觉对于不大不小的公司,技术方案评估上,速度性能很看重。从这点上大家会选择key value db,而不是document db

引用
但是couchdb可以把数据以view的方式展现,要什么,就新建什么样的view
这种随心所欲索引方式,在不少应用的场合,
通过view的方式把这种查询结果持久化,
可以大大减少了把传统意义上的重复且相似查询


感觉这种需求没有被挖掘出来,大家还是适合使用sql来获取所需数据,不会考虑这种陌生的东西。

相关推荐

    CouchDB权威指南

    《CouchDB权威指南》是一本深入探讨CouchDB数据库系统的专著,旨在为读者提供全面、详尽的CouchDB知识。CouchDB是一种基于文档的分布式数据库系统,采用JSON作为数据格式,JavaScript作为查询语言,并且支持多版本...

    CouchDB权威指南(中文 完整版)

    根据提供的文件信息,我们可以推断出这是一份关于CouchDB的权威指南,该文档为中文版,并且是完整的两百多页版本。下面将基于这些信息生成相关的CouchDB知识点。 ### CouchDB简介 CouchDB是一款面向文档、分布式且...

    CouchDB权威指南(带详细目录)PDF

    通过《CouchDB权威指南》,你将学会如何通过CouchDB的RESTful Web接口来使用它,此外你还会熟悉CouchDB的一些主要特性,比如简单的文档的CRUD(创建、读取、更新、删除); 高级的MapReduce,部署优化等更多的内容...

    CouchDB权威指南].(CouchDB:The.Definitive.Guide)

    ### CouchDB权威指南知识点概述 #### 一、CouchDB简介 CouchDB(Cluster of Unstructured Data Base)是一款开源的、面向文档的NoSQL数据库系统。它由Apache软件基金会维护,采用JSON来存储数据,HTTP协议进行数据...

    Beginning CouchDB.pdf

    《Beginning CouchDB》这本书由Joe Lennon编写,旨在为初学者提供一套全面的指南,帮助他们掌握CouchDB的基本概念和技术细节。 #### 二、CouchDB的特点 1. **文档存储**:CouchDB采用JSON文档作为数据存储格式,这...

    CouchDB:权威指南(第一版)CouchDB: The Definitive Guide (1st Edition)

    CouchDb的三位创建者向您展示了如何将此面向文档的数据库用作独立的应用程序框架或用于大量分布式应用程序。

    apache-couchdb-2.3.1.zip

    Apache CouchDB是一个开源的、基于文档的分布式数据库系统,它采用了JSON作为数据格式,并使用JavaScript进行查询和数据处理。在2.3.1版本中,CouchDB继续提供了一流的可扩展性和灵活性,适用于各种应用程序,特别是...

    couchdb源码

    CouchDB是一款开源的文档数据库管理系统,以其独特的JSON数据模型、RESTful API和分布式系统设计而闻名。在深入探讨CouchDB源码之前,我们首先理解CouchDB的基本概念和工作原理。 CouchDB的核心是基于JSON...

    CouchDB20 分钟入门

    学习couchDB 的入门教程

    Apress.Beginning.CouchDB.Dec.2009.pdf

    《初识CouchDB》是一本面向专业人士的专业书籍,它详细介绍...总的来说,《初识CouchDB》是理解、掌握并运用CouchDB的宝贵资源,无论你是对NoSQL感兴趣,还是寻求一种新的数据管理解决方案,这本书都提供了全面的指南。

    CouchDB独立博客sofa-CouchDB.zip

    sofa-CouchDB 是 CouchDB 的独立博客,使用 CouchDB 的书来做主要内容,这方便了所有用来在这博客上交流他们的想法,并且里面提供了很多帮助指导,这都是 HTML,Javascript 和 CouchDB 的结晶。目前支持任何人在上面...

    CouchDB资料整理

    CouchDB是一款开源的数据库系统,属于Apache软件基金会的一个项目。它是一种NoSQL数据库,以文件存储形式使用JSON作为数据存储格式,并采用JavaScript作为查询语言。CouchDB具有灵活的API,支持MapReduce和HTTP等...

    CouchDB,Python

    CouchDB是一款开源的、基于文档的分布式数据库系统,它以JSON格式存储数据,并使用JavaScript作为查询语言。Python中的CouchDB模块是Python与CouchDB服务器交互的接口,允许开发者使用Python编写代码来操作CouchDB...

    数据库CouchDB入门到精通.txt打包整理.zip

    安装过程相对简单,下载安装包后按照官方指南进行配置。配置文件通常位于`etc/couchdb/local.ini`,可以通过修改该文件设置端口、认证和日志记录等选项。 三、RESTful API CouchDB提供了基于HTTP的RESTful API,...

    Fabric 1.4基于couchdb环境搭建

    Fabric 1.4基于couchdb环境搭建步骤,以及基于couchdb的区块链多字段数据查询

    Apache-CouchDB.zip

    CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (JSON) API 访问。术语 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母缩写,它反映了 CouchDB...

Global site tag (gtag.js) - Google Analytics