在 CouchDB 映射函数中发出日期时 - 在日期对象上调用什么?

When emitting a date in a CouchDB Map function - what is being called on the date object?

我正在尝试将 Date 对象作为 map 函数中的键发出,但无法理解 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}
]}

键的空值来自哪里?它不会像 return "Invalid Date"

那样在日期上调用 toString()toISOString()

这是怎么回事?

基本上,它是这样工作的:

function emit(key, value) {
    var row = { id: currentDocId(), key: key, value: value };
    appendToOutput(JSON.stringify(row));
}

鉴于 toJSON() 在无效日期 returns null.

,因此应该很容易看出这些值的来源

实际上根本不是 emit() 函数执行此操作,而是在未提供 list function 时使用的默认渲染实现。

while (row = getRow()) {
    send(JSON.stringify(row))
}