CouchDB的发射和可变键

时间:2014-05-14 05:03:06

标签: mapreduce couchdb

我有一个错误,当在视图函数中发出键后突变键时会导致错误的视图结果。在发光时执行key.slice()时,该错误消失,但是视频功能以这种方式变得非常慢。我想避免在那里做任何不必要的克隆。你是否有可能在发射它们之后改变键是否有可能? (突变只影响当地的州,而不是文件)。

编辑:更好的代码示例。以下导致意外的结果(虽然我还没有找到任何一致性,它可能只是做一些随机内存损坏)。

 'map' : "function(doc) {
    key = [doc.foo];
    emit(key, null);
    key[0] = doc.bar;
    emit(key, null);
 }

虽然这有效(在发出密钥时进行克隆):

 'map' : "function(doc) {
    key = [doc.foo];
    emit(key.slice(), null);
    key[0] = doc.bar;
    emit(key.slice(), null);
 }

我找不到有关emit实际正在做什么的任何文档 - 它是仅存储对内存中对象的引用还是克隆或序列化传递给它的对象?前者在某种程度上解释了我注意到的行为,而后者意味着我现在正在进行不必要的克隆,而且我的代码还有其他问题。所以我的问题是:你知道如何实现emit以及它如何影响这段代码吗?

1 个答案:

答案 0 :(得分:0)

发出什么

Emit返回一组键控数据(在您的情况下为null。)以及从中获取此数据的文档的详细信息。

想象一下,您有一些文档在一组时间内显示来自一组位置的天气数据,那么您可能希望以这种格式返回密钥:

emit([ location, measure, year, month, day, hour ], relevant_data)

您可以将relevant_data设置为null,并在查询中使用include_docs=true选项将文档作为响应的一部分。这是不好的做法,并且可能会导致因为您检索到视图后文档已更新的竞争条件。

另一种方法是您返回实际相关数据。因此,如果您在某个位置有多个天气观测值,则可能需要为每个观测值发射它们。

你错了

如果您的地图功能导致异常,则不返回任何内容。我相信slice函数需要一个参数来表示您要返回的元素。这会遇到异常并且不会返回任何数据。

如果要在数组中为每个元素返回一个键,则必须遍历键中元素的长度并且每个元素都有一个发射。