couchDB视图
视图是设计文档的一部分。
视图函数
map函数
Map方法的参数只有一个,就是当前的文档对象。Map方法的实现需要根据文档对象的内容,确定是否要输出结果。 如果需要输出的话,可以通过emit来完成。 emit方法有两个参数,分别是key和value,分别表示输出结果的键和值。 使用什么样的键和值应该根据视图的实际需要来确定。 emit函数可以在map函数里被调用多次,创建一个文档的多个记录。
当希望对文档的某个字段进行排序和过滤操作的时候,应该把该字段作为键(key)或是键的一部分; value的值可以提供给 Reduce 方法使用,也可能会出现在最终的结果中。 可以作为键的不仅是简单数据类型,也可以是任意的 JSON 对象。比如emit([doc.title, doc.price], doc)中,使用数组作为键。
map函数示例(javascript代码):
function(doc) {
emit(doc._id, doc);
}
reduce函数
Reduce方法的参数有三个:key、values和rereduce,分别表示键、值和是否是rereduce 。 由于rereduce情况的存在,Reduce 方法一般需要处理两种情况:
传入的参数rereduce的值为false
这表明Reduce方法的输入是 Map方法输出的中间结果。
参数key的值是一个数组,对应于中间结果中的每条记录。 该数组的每个元素都是一个包含两个元素的数组,第一个元素是在Map方法中通过emit输出的键(key),第二个元素是记录所在的文档 ID 。
参数values的值是一个数组,对应于 Map 方法中通过emit输出的值(value)。
传入的参数rereduce的值为true
这表明Reduce方法的输入是上次Reduce方法的输出。
参数key的值为null。
参数values的值是一个数组,对应于上次Reduce方法的输出结果。
reduce函数示例(javascript代码):
function (key, values, rereduce) {
return sum(values);
}
实例解析
1、创建数据库testdb2,添加如下文档 :
{
"_id": "ef3c0dddfd988a9fa5dd77452a46a5e6",
"phoneNumber": "1001",
"billSeconds": 180,
"timestamp": "201408251705"
}
{
"_id": "ef3c0dddfd988a9fa5dd77452a482dd0",
"phoneNumber": "1001",
"billSeconds": 100,
"timestamp": "201408251715"
}
上述是分机1001的两条CDR,记录了两次通话的billSeconds,如果要计算通话时长,需要将 phoneNumber作为key,billSeconds作为value进行map和reduce操作。
2、用map操作过滤数据
function(doc) {
emit(doc.phoneNumber, doc.billSeconds);
}
map函数以phoneNumber参数作为key,以billSeconds作为value对数据库执行过滤操作。
3、用reduce计算结果
function (key, values, rereduce)
{
return sum(values);
}
reduce函数执行聚合操作,将key相同的value进行求和。
完整view创建代码如下:
{
"_id": "_design/jsTest",
"language": "javascript",
"views": {
"all": {
"map": "function(doc) { emit(doc.phoneNumber, doc.billSeconds); }",
"reduce": "function (key, values, rereduce) { return sum(values); }"
}
}
}
查询结果
单独执行map的结果:
curl http://127.0.0.1:5984/testdb2/_design/jsTest/_view/all?reduce=false
{"total_rows":2,"offset":0,"rows":[
{"id":"ef3c0dddfd988a9fa5dd77452a46a5e6","key":"1001","value":180},
{"id":"ef3c0dddfd988a9fa5dd77452a482dd0","key":"1001","value":100}
]}
map-reduce结果:
curl http://127.0.0.1:5984/testdb2/_design/jsTest/_view/all?group=true
{"rows":[
{"key":"1001","value":280}
]}
视图类别
临时视图
python示例:
import couchdb
server = couchdb.Server("http://192.168.131.121:5984")
db = server.create('python-tests')
db['johndoe'] = dict(type='Person', name='John Doe')
db['maryjane'] = dict(type='Person', name='Mary Jane')
db['gotham'] = dict(type='City', name='Gotham City')
map_fun = '''function(doc) {
if (doc.type == 'Person')
emit(doc.name, null);
}'''
for row in db.query(map_fun):
print(row.key)
del server['python-tests']
BigCouch不支持临时视图
永久视图
python示例:
import couchdb
server = couchdb.Server("http://192.168.131.121:5984")
db = server.create('python-tests')
db['johndoe'] = dict(type='Person', name='John Doe')
db['maryjane'] = dict(type='Person', name='Mary Jane')
db['gotham'] = dict(type='City', name='Gotham City')
viewData = {
"getdata":{
"map":"function(doc){ if (doc.type == 'Person') emit(doc.name, null);}"
}
}
db['_design/example'] = dict(language='javascript', views=viewData)
for row in db.view('example/getdata'):
print(row.key)
del server['python-tests']
视图实现语言
javascript实现
couchDB默认的查询语言是javascript,不需要进行配置即可使用js创建视图。
示例代码:
{
"_id": "_design/jsTest",
"language": "javascript",
"views": {
"all": {
"map": "function(doc) { emit(doc._id, doc); }",
"reduce": "function (key, values, rereduce) { return values.length; }"
}
}
}
erlang实现
编辑local.ini文件,添加如下配置:
[native_query_servers]
erlang = {couch_native_process, start_link, []}
配置后需要重启couchDB服务器。
示例代码:
{
"_id": "_design/erlangTest",
"language": "erlang",
"views": {
"all": {
"map": "%% Map Function\nfun({Doc}) ->\n V = proplists:get_value(<<\"_id\">>, Doc, null),\n Emit(V,{Doc})\nend.\n\n",
"reduce": "%% Reduce Function\nfun(Keys, Values, ReReduce) -> length(Values) end."
}
}
}
python实现
安装couchdb-python包:
pip install pycouchdb
or
pip install -i http://simple.crate.io/ pycouchdb
or
git clone git://github.com/niwibe/py-couchdb.git
cd py-couchdb
python setup.py install
编辑local.ini文件,添加如下配置:
[query_servers]
python=/usr/bin/couchpy
配置后需要重启couchDB服务器。
示例代码:
{
"_id": "_design/pythonTest",
"language": "python",
"views": {
"all": {
"map": "def fun(doc):\n yield doc['_id'],doc\n",
"reduce": "def fun(key, values, rereduce):\n return len(values)\n"
}
}
}
视图的使用
运行视图的可选参数
key 限定结果中只包含键为该参数值的记录。
startkey 限定结果中只包含键大于或等于该参数值的记录。
endkey 限定结果中只包含键小于或等于该参数值的记录。
limit 限定结果中包含的记录的数目。
descending 指定结果中记录是否按照降序排列。
skip 指定结果中需要跳过的记录数目。
group 指定是否对键进行分组。
reduce 指定reduce=false可以只返回 Map 方法的运行结果。
示例数据:
{
"_id": "ef3c0dddfd988a9fa5dd77452a46a5e6",
"phoneNumber": "1001",
"billSeconds": 180,
"timestamp": "201408251705"
}
{
"_id": "ef3c0dddfd988a9fa5dd77452a482dd0",
"phoneNumber": "1001",
"billSeconds": 100,
"timestamp": "201408251715"
}
{
"_id": "ef3c0dddfd988a9fa5dd77452a63a9e3",
"phoneNumber": "1002",
"billSeconds": 180,
"timestamp": "201408251735"
}
{
"_id": "5fecc0d7fe5acac6b46359b5eec4f3ff",
"phoneNumber": "1003",
"billSeconds": 190,
"timestamp": "201408261035"
}
{
"_id": "_design/jsTest",
"language": "javascript",
"views": {
"all": {
"map": "function(doc) { emit(doc.phoneNumber, doc.billSeconds); }",
"reduce": "function (key, values, rereduce) {return sum(values); }"
}
}
}
查找单个文档
语法:
/database/_design/designdocname/_view/viewname?key="${key}"
示例:
curl "http://192.168.131.121:5984/testdb2/_design/jsTest/_view/all?group=true&key=\"1001\""
{"rows":[
{"key":"1001","value":280}
]}
查找多个文档
语法:
/database/_design/designdocname/_view/viewname?startkey="${startkey}"&endkey="${endkey}"
示例:
curl "http://192.168.131.121:5984/testdb2/_design/jsTest/_view/all?group=true&startkey=\"1001\"&endkey=\"1002\""
{"rows":[
{"key":"1001","value":280},
{"key":"1002","value":180}
]}
curl "http://192.168.131.121:5984/testdb2/_design/jsTest/_view/all?group=true&startkey=\"1001\""
{"rows":[
{"key":"1001","value":280},
{"key":"1002","value":180},
{"key":"1003","value":190}
]}
curl "http://192.168.131.121:5984/testdb2/_design/jsTest/_view/all?group=true&endkey=\"1002\""
{"rows":[
{"key":"1001","value":280},
{"key":"1002","value":180}
]}
本文github地址:
https://github.com/mike-zhang/mikeBlogEssays/blob/master/2014/20141007_couchDB视图.md
欢迎补充
couchDB视图的更多相关文章
- couchDB文档
每个文档都是自包含的数据单元,是一系列数据项的集合. 每个数据项都有一个名称与对应的值,值既可以是简单的数据类型,如字符串.数字和日期等:也可以是复杂的类型,如有序列表和关联对象. 每个文档都有一个全 ...
- CouchDB简单应用
CouchDB是众多称作NoSQL解决方案中的一员.与众不同的是,CouchDB是一个面向文档的数据库,在它里面所有文档域(Field)都是以键值对的形式存储的.域(Field)可以是一个简单的键值对 ...
- CouchDB 简单HTTP接口使用说明
目录 1.简介 2.安装 2.HTTP接口简单使用 2.1.认证接口 2.1.1 Basic Authentication 2.1.2 Cookie Authentication 2.2 创建与删除数 ...
- CouchDB学习-介绍
官方文档 CouchDB 1文档存储 CouchDB服务器主机是一个存储文档的数据库.每一个文档在数据库中都有唯一的名字.CouchDB提供RESTful HTTP API用来读取和更新(添加,编辑, ...
- CouchDB学习一
端口 端口号 协议 作用 5984 tcp 标椎集群端口用于所有的HTTP API请求 5986 tcp 用于管理员对节点与分片的管理 4369 tcp Erlang端口到daemon的映射 配置介绍 ...
- CouchDB简介
类型:开源数据库,Apache项目 存储格式:JSON 查询语言:JavaScript API :MapReduce.HTTP 特点 MVCC(Multiversion concurrency con ...
- apache开源项目--CouchDB
Apache CouchDB 是一个面向文档的数据库管理系统.它提供以 JSON 作为数据格式的 REST 接口来对其进行操作,并可以通过视图来操纵文档的组织和呈现. CouchDB 是 Apache ...
- 84. 从视图索引说Notes数据库(下)
作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...
- 对比Cassandra、 Mongodb、CouchDB、Redis、Riak、 Membase、Neo4j、HBase
转自:http://www.cnblogs.com/alephsoul-alephsoul/archive/2013/04/26/3044630.html 导读:Kristóf Kovács 是一位软 ...
随机推荐
- 虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构
这一篇我要体验的虚拟机系统是 Xen.在虚拟机领域,Xen 具有非常高的知名度,其名字经常在各类文章中出现.同时 Xen 也具有非常高的难度,别说玩转,就算仅仅只是理解它,都不是那么容易.之所以如此, ...
- Async和Await异步编程的原理
1. 简介 从4.0版本开始.NET引入并行编程库,用户能够通过这个库快捷的开发并行计算和并行任务处理的程序.在4.5版本中.NET又引入了Async和Await两个新的关键字,在语言层面对并行编程给 ...
- 搭建一个简单的mybatis框架
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- 游戏服务器菜鸟之C#初探四游戏服务
经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...
- Python 小白的新手教程(一)
本文是 python 入门级别的基础知识,包括数据类型和变量.输入输出.字符串和编码.list tuple dict set .条件判断.循环.函数.切片 迭代 列表生成器 生成器 迭代器等. 参考课 ...
- 4.修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)
1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...
- html5中canvas的使用 获取鼠标点击页面上某点的RGB
1.html5中的canvas在IE9中可以跑起来.在IE8则跑不起来,这时候就需要一些东西了. 我推荐这种方法,这样显得代码不乱. <!--[if lt IE9]> <script ...
- 重磅来袭,使用CRL实现大数据分库分表方案
关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...
- JQuery中ajax的相关方法总结
前提条件 话说是jquery中的ajax方法,那么前提条件当然是引入jquery啦. <script src="http://libs.baidu.com/jquery/1.9.0/j ...
- SQL Tuning 基础概述08 - SQL Tuning Advisor
SQL调优顾问 SQL Tuning Advisor的使用案例: 1.构建测试表T 2.定义调整任务 3.修改调整任务参数 4.执行调整任务 5.监控调整任务 6.查看调整任务建议 7.删除调整任务 ...