如何按字段对文档进行分组并使用带有 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】:
您可以使用reduce 和Set
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 函数列出不相等的值的主要内容,如果未能解决你的问题,请参考以下文章