我尝试将Date对象作为地图函数中的键进行试验,并且无法理解Date对象未正确解析时发生的事情。
使用简单的示例记录集:
{
"_id": "e3681a4f5ce5685b777659804e9fd9f1",
"date": "2016-04-04T16:02:09.058+01:00" // okay datestring
}
{
"_id": "99a5c50967a279e1d7fef1a4ed18d7fb",
"date": "2016-04-34T16:02:09.058+01:00" // invalid datestring
}
{
"_id": "43a435ce71a4b92ab0dd4fe9d91fbbb2",
"date": "text" // invalid datestring
}
以下地图功能:
function(doc) {
var date = new Date(doc.date);
emit(date,1);
}
提供以下结果集:
{"total_rows":3,"offset":0,"rows":[
{"id":"43a435ce71a4b92ab0dd4fe9d91fbbb2","key":null,"value":1},
{"id":"99a5c50967a279e1d7fef1a4ed18d7fb","key":null,"value":1},
{"id":"e3681a4f5ce5685b777659804e9fd9f1","key":"2016-04-04T15:02:09.058Z","value":1}
]}
密钥的空值来自何处?它没有在日期上调用toString()
或toISOString()
,因为他们会返回"Invalid Date"
这里发生了什么?
答案 0 :(得分:2)
基本上,它的工作原理如下:
function emit(key, value) {
var row = { id: currentDocId(), key: key, value: value };
appendToOutput(JSON.stringify(row));
}
因此,如果无效日期toJSON()
返回null
,则应该很容易看到值来自何处。
实际上,它根本不是emit()
函数,而是在没有提供list function时使用的默认渲染实现。
while (row = getRow()) {
send(JSON.stringify(row))
}