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

use*_*770 7 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

oku*_*row 9

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

第二: 假设您的doc拥有多个项目:

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

startkey=["project1","monthday",3]&endkey=["project1","monthday",3,{}]
Run Code Online (Sandbox Code Playgroud)

一个月的一天:

key=["project1","monthday",3,9]
Run Code Online (Sandbox Code Playgroud)

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

 startkey=["project1","monthday"]&endkey=["project1","monthday",{}]&group_level=3
Run Code Online (Sandbox Code Playgroud)

...

"key":["project1","monthday",2],"value:1),  // 1 Day in month 2
"key":["project1","monthday",3],"value:2)   // 2 Days in month 3
Run Code Online (Sandbox Code Playgroud)

使用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), 
Run Code Online (Sandbox Code Playgroud)

当然,您可以将最后一个案例与&include_docs = true结合使用以获取数据

第三:

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

第四:

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