在CouchDB中,多发射映射函数是否可以模拟特殊类型的查询来炸毁我的Couch大小?

时间:2012-03-07 18:13:42

标签: couchdb

我有一个CouchDB数据库(我们会说它包含项目时间卡相关数据:项目代码,人员,人员职位,任务,日期,工作时间,账单费率等)。我希望按日...或按人,或按任务,按标题或任何单一属性创建项目的摘要视图。

我担心我会走上一条不可持续的道路,而且我的数据库大小可能会远远超过它所需的范围。

我创建了一个带有map函数的视图,该函数多次发出每个文档,每个属性一次。这样可行。但这是否会达到你应该停止的终点?

我有多个发射:

emit([doc.project, 'day', doc.day], doc);
emit([doc.project, 'month', doc.month], doc);
emit([doc.project, 'person', doc.person], doc);
emit([doc.project, 'job title', doc.persons-job-title], doc);
emit([doc.project, 'task', doc.task], doc);

然后始终使用[project,]的开始/结束键查询[project ,, {}]

我的数据库最终会变得如此巨大,以至于添加任何新数据会非常昂贵吗?多发射()是做我想做的事情的首选方法吗?那里有更好/不同的方式吗?

基于文档动态创建emit是否会在某些巨型文档出现并创建巨大的存储要求时遇到麻烦?

基本上,有一点我应该停止疯狂吗?

1 个答案:

答案 0 :(得分:9)

首先: 不要将doc作为值发出...如果需要结果集中的数据,可以使用&include_docs=true

<强>第二 假设您的文档包含多个项目:

是否有意义,在没有月份的一天要求项目? 如果没有,您可以使用emit([doc.project,'monthday',doc.month,doc.day],1) 然后你可以要求一个月内的所有项目:

startkey=["project1","monthday",3]&endkey=["project1","monthday",3,{}]

一个月中的某一天:

key=["project1","monthday",3,9]

如果您使用的是简单的reduce函数(_sum),那么您可以查询项目有多少天(+一个月内):

 startkey=["project1","monthday"]&endkey=["project1","monthday",{}]&group_level=3

...

"key":["project1","monthday",2],"value:1),  // 1 Day in month 2
"key":["project1","monthday",3],"value:2)   // 2 Days in month 3

使用group_level = 4(与reduce = false相同):

"key":["project1","monthday",2,20],"value:1), 
"key":["project1","monthday",2,21],"value:1),  
"key":["project1","monthday",3,1],"value:1), 

当然你可以将最后一个案例与&amp; include_docs = true结合起来获取数据

第三:

每个文档可以发出多个值... 当然,您可以将发射分隔到不同的视图中,因此您不需要第二个键。 试着找出哪些信息属于一起,没有其他信息就没用了(比如日/月,人/工作标题?)

<强>第四:

添加数据并不昂贵..只是构建视图; - )