如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值

Posted

技术标签:

【中文标题】如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值【英文标题】:How to group documents by a field and list unequal values with custom reduce function with CouchDB view 【发布时间】:2019-09-09 02:09:37 【问题描述】:

我在 CouchDB 中有 1000 份员工文档,简化格式如下所示:


    "_id": "1111",
    "departmentId": "dept_A",
    "siteId": "SITE_1"


    "_id": "2222",
    "departmentId": "dept_B",
    "siteId": "SITE_1"


    "_id": "3333",
    "departmentId": "dept_C",
    "siteId": "SITE_1"


    "_id": "4444",
    "departmentId": "dept_C",
    "siteId": "SITE_1"


    "_id": "5555",
    "departmentId": "dept_A",
    "siteId": "SITE_2"


    "_id": "6666",
    "departmentId": "dept_A",
    "siteId": "SITE_2"

我有这样的看法:

function (doc) 
    if (doc.departmentId && doc.siteId) 
        emit(doc.siteId, doc.departmentId);
    

这将像这样显示数据:

"SITE_1": "dept_A"
"SITE_1": "dept_B"
"SITE_1": "dept_C"
"SITE_1": "dept_C"
"SITE_2": "dept_A"
"SITE_2": "dept_A"

但是,我想使用带有 CouchDB 视图的自定义 reduce 函数来对数据进行分组,如下所示:

"SITE_1": ["dept_A", "dept_B", "dept_C"]
"SITE_2": ["dept_A"]

CouchDB 视图的自定义 reduce 函数如下所示:

function (keys, values, rereduce) 


【问题讨论】:

siteId: 1 未包含在您的输出中是拼写错误还是您没有按任何规则添加? 错字感谢现场 【参考方案1】:

您可以使用reduceSet

let arr= ["_id": "1111","departmentId": "dept_A","siteId": "SITE_1","_id": "2222","departmentId": "dept_B","siteId": "SITE_1","_id": "3333","departmentId": "dept_C","siteId": "SITE_1","_id": "4444","departmentId": "dept_C","siteId": "SITE_1","_id": "5555","departmentId": "dept_A","siteId": "SITE_2","_id": "6666","departmentId": "dept_A","siteId": "SITE_2"]

let final = arr.reduce((op, siteId, departmentId) => 
  op[siteId] = op[siteId] || new Set()
  op[siteId].add(departmentId)
  return op
,)

console.log(...final['SITE_1'])
console.log(...final['SITE_2'])

【讨论】:

这个 js 对于 CouchDB reduce 来说太现代了。它不适用于“let”等。 @xpqz 这个代码可以很容易地转换成for循环和var这种情况

以上是关于如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值的主要内容,如果未能解决你的问题,请参考以下文章

couchdb:更新带有附件的文档上的元数据?

CouchDB - 按位置对文档进行排序

如何使用 CouchDB 按年和月对条目进行分组?

如何使用 CouchApp 对 CouchDB 进行 TDD?

Pandas - 按字段分组并使用显示该字段数量的列

如何使用带有 Pandas 的时间戳按小时对数据帧进行分组