Mapreduce CouchDB';s发射和可变键

Mapreduce CouchDB';s发射和可变键,mapreduce,couchdb,Mapreduce,Couchdb,我有一个错误,当在视图函数中发出键后对其进行变异时,会导致错误的视图结果。在发射时执行key.slice()时,该错误会消失,但是视图函数以这种方式变得非常缓慢。我想避免在那里做任何不必要的克隆。你是否有任何洞察,是否有可能在发出键后对其进行变异?(突变只影响当地政府,而不影响文件) 编辑:更好的代码示例。下面将导致意外的结果(虽然我还没有发现它们之间的一致性,但这可能会导致一些随机内存损坏) 当这起作用时(在发出密钥时进行克隆): 我找不到任何关于emit实际上在做什么的文档——它是只在内存中

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

编辑:更好的代码示例。下面将导致意外的结果(虽然我还没有发现它们之间的一致性,但这可能会导致一些随机内存损坏)

当这起作用时(在发出密钥时进行克隆):


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

Emit返回一组键入的数据(在您的情况下为null)以及该数据来自的文档的详细信息

假设您的文档在一组时间显示来自一组位置的天气数据,那么您可能希望以以下格式返回关键字:

emit([ location, measure, year, month, day, hour ], relevant_data)
您可以将
relevant_data
设置为
null
,并在查询中使用
include_docs=true
选项来获取作为响应一部分的文档。但这是一种不好的做法,可能会导致争用情况,即自检索视图后文档已更新

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

你错在哪里

如果map函数导致异常,则不会返回任何内容。我相信
slice
函数需要一个参数,用于返回哪个元素。这将遇到异常,并且不会返回任何数据


如果要在数组中为每个元素返回一个键,则必须遍历键中元素的长度,并为每个元素生成一个emit

不知道你在问什么。您是说您创建了一个视图,并且在map函数中有类似于
emit(doc.id.slice(x),doc.something)的东西这不起作用?一个稍微扩展的代码示例会很有帮助。我刚刚扩展了我的问题,谢谢你的消息。slice()的版本正在运行,但我希望避免使用它,并希望对emit的功能进行一些说明。
 'map' : "function(doc) {
    key = [doc.foo];
    emit(key.slice(), null);
    key[0] = doc.bar;
    emit(key.slice(), null);
 }
emit([ location, measure, year, month, day, hour ], relevant_data)