我使用的是CouchDB,我想在查询数据时更好地利用MapReduce。
我的确切用例如下:
我有很多调查。每个调查都有一个meterNumber,meterReading和meterReadingDate,例如:
{
meterNumber: 1,
meterReading: 2050,
meterReadingDate: 1480000000000
}
然后我使用Map函数来生成meterNumber的读数。有许多键重复(在不同日期读取相同的仪表)。即。
[
[meterNumber, {reading: xxx, readingDate: xxx}],
[meterNumber, {reading: xxx, readingDate: xxx}],
[meterNumber, {reading: xxx, readingDate: xxx}],
etc
]
然后我在发送到reduce函数之前对这些进行分组,然后reduce函数应该实际扩展设置的值。即我想要这个:
[
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
[meterNumber, [{reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}, {reading:xxx, readingDate: xxx}]],
etc
]
要在CouchDB上运行此MapReduce视图,我必须允许这种类型的结果集(Couchdb - Is it possible to deactivate the reduce_overflow_error error)。
这告诉我,我可能遇到大型结果集的性能问题。是这样的吗?为什么要在CouchDB上专门启用此设置?
***编辑
下面接受的答案向我指出,我在MapReduce中所做的事情也可能(并且更好)使用列表。这是关于同一主题的另一个很好的Stack Overflow答案:Best way to do one-to-many "JOIN" in CouchDB
***编辑
以下是CouchDB文档的参考:http://guide.couchdb.org/draft/transforming.html
答案 0 :(得分:3)
reduce
函数旨在 reduce 与给定键相关联的值。
CouchDB reduce_limit
用于检测设计糟糕的reduce函数,这是你通过连接值所做的...但不要惊慌:CouchDB中的任何新手都会做同样的错误。
在reduce
函数中连接值的问题是:
map
函数),所以......只需编写一个最小map
函数,例如:
function(o){
emit(o.meterNumber);
}
不要写任何reduce
函数。并使用include_docs=true
调用该视图。
但也许您对数据格式不满意?
没问题:你有list
个功能。请记住,map
和reduce
函数应该用于纯数据处理,而不是用于格式化目的。