Mapreduce 如何检索文档的不同属性

Mapreduce 如何检索文档的不同属性,mapreduce,couchdb,pouchdb,Mapreduce,Couchdb,Pouchdb,在我们的CouchDB文档数据库中,我们有具有不同状态属性值的文档,如下所示: doc1: {status: "available"}, doc2: {status: "reserved"}, doc3: {status: "available"}, doc4: {status: "sold"}, doc5: {status: "available"}, doc6: {status: "destroyed"}, doc7: {status: "sold"} [...] 现在,我想编写一个map

在我们的CouchDB文档数据库中,我们有具有不同状态属性值的文档,如下所示:

doc1: {status: "available"},
doc2: {status: "reserved"},
doc3: {status: "available"},
doc4: {status: "sold"},
doc5: {status: "available"},
doc6: {status: "destroyed"},
doc7: {status: "sold"}
[...]
现在,我想编写一个map reduce函数,返回所有文档中存在的所有不同状态值:[可用、保留、出售、销毁]

我的方法是开始编写一个map函数,该函数只返回每个文档的status属性:

function (doc) {
  if(doc.status) {
    emit(doc._id, doc.status);
  }
}
现在,我想将所有地图行相互比较,这样就不会返回状态重复项

function(keys, values, rereduce) {
  var array = [];

  if(rereduce) {
    return values;
  } else {
    if(array.indexOf(values[0]) === -1) {
      array.push(values[0]);
    }
  }

  return array;
}
这似乎是非常详细和技术性的,但不能真正投射到我们的用例中,它没有任何类似于博客文章中的嵌套结构,只是带有status属性的平面对象。此外,我们的后端使用PockDB作为适配器连接到远程CouchDB

我发现在执行reduce函数时,当我试图理解引擎盖下发生的事情时,会返回一些奇怪的结果

function(keys, values, rereduce) {
  var array = [];

  if(rereduce) {
    return values;
  } else {
    if(array.indexOf(values[0]) === -1) {
      array.push(values[0]);
    }
  }

  return array;
}
结果:

{
  "rows": [
    {
      "key": null,
      "value": "[reduce] [status] available,available,[status] sold,unknown,[status] available,[status] available,[status] available,reserved,available,[status] reserved,available,[status] available,[status] sold,reserved,[status] sold,sold,[status] available,available,[status] reserved,[status] reserved,[status] available,[status] reserved,available"
    }
  ]
}
reduce步骤似乎只执行一次,而status循环有时只有一个值,然后是两个或三个值,没有可识别的逻辑或模式

有人能给我解释一下吗

如何检索具有所有不同状态值的数组 CouchDB的reduce函数的逻辑或工作流程是什么?为什么状态行具有任意数量的状态值?
由于@chrisinmtown的评论,我能够使用以下功能实现状态值的不同检索:

function map(doc) {
  if(doc.status) {
    emit(doc.status, null);
  }
}
发送查询参数group=true也很重要,否则结果将为空:

// PouchDB request
return this.database.query('general/all-status', { group: true }).pipe(
  map((response: PouchDB.Query.Response<any>) => response.rows.map((row: any) => row.key))
);

有关如何使用视图和查询的详细信息,请参见。

是否确定重新导出条件?我认为你应该否定这一点。你应该附加推送,以防再次减少。可能是酷的欺骗。请说明如何发送查询参数group=true,这也将帮助下一个人。那么,呃,您使用的是Coach还是Pocket数据库?我使用CouchDB实例作为远程数据库,但我也使用PockDB作为本地适配器从NestJS后端连接到远程数据库。因此,当设计文档和视图函数存储在远程CouchDB中时,请求语法与数据库一致。