没有参数的CouchDB Emit

时间:2016-02-16 18:33:29

标签: javascript couchdb

请考虑以下代码:

module.exports = {
  by_author: {
    map: function(doc) {
      if ('authors' in doc) {
        doc.authors.forEach(emit);
      }
    }.toString(),
    reduce: '_count'
  },

  by_subject: {
    map: function(doc) {
      if ('subjects' in doc) {
        doc.subjects.forEach(function(subject){
          emit(subject, subject);

          subject.split(/\s+--\s+/).forEach(function(part){
            emit(part, subject);
          });
        });
      }
    }.toString(),

    reduce: '_count'
  }
};

doc.authors.forEach(emit);看起来不是有效的语法(或良好的编码),但它似乎在语法上是正确的。

我的问题是,这个的简写如下:

doc.authors.forEach(function(_doc) {
    emit(_doc.id, _doc);
});

如果是这样,使用这种速记有什么好处吗?它是如何工作的?

参考。 https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Map_Functions

1 个答案:

答案 0 :(得分:3)

emit是CouchDB公开的函数。在JS函数中是一流的。 (并且可以作为参数传递给其他函数)

代替解释所有这些,我只会向您展示您的代码实际在做什么。 (如果你是新的话,请阅读更多关于JS中的函数的信息)

doc.authors.forEach(emit);

doc.authors.forEach(function (item, index, list) {
  emit(author, index, list);
});

在JS中,传递给forEach处理程序fn的参数是:

  • 数组中的项目(即:"some user"
  • 数组中该项的索引(例如:0
  • 整个数组(例如:[ "some user" ]

emit()函数只接受2个参数,因此只会忽略第3个参数。因此,对于单个项目数组,您将获得等效的emit("some user", 0)。如果有多个项目,您也可以获得其他项目。