Mapreduce 如何检索文档的不同属性
在我们的CouchDB文档数据库中,我们有具有不同状态属性值的文档,如下所示: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
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中时,请求语法与数据库一致。