在CouchDB Map函数中发出日期时 - 日期对象上调用的是什么?

时间:2016-05-05 13:16:07

标签: javascript date dictionary key couchdb

我尝试将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"

这里发生了什么?

1 个答案:

答案 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))
}