我想在CouchDB中找到相同的值。我的地图是
function(doc) {
var user = [];
if(doc.type = 'user'){
user.push(doc.name);
emit( doc.type, user);
}
}
我的结果如
["Bob"],["Peter"],["Bob"] ....
我喜欢像
一样减少["Bob","Peter","Bob"]
或只有重复的数组
["Bob","Bob"]
我不明白减少如何运作。 调用foreach值reduce或仅在地图完成时调用?
答案 0 :(得分:6)
我们假设你有以下三个文件。
鲍勃:
{
"_id": "89d9ffe10a33df504ecc8d7c9a975eed",
"_rev": "1-dfc3128d8d80760f2cf40328dd24553e",
"type": "user",
"name": "Bob"
}
彼得:
{
"_id": "89d9ffe10a33df504ecc8d7c9a98a0c6",
"_rev": "1-820e231c44f9b3125db79e0c00bbc050",
"type": "user",
"name": "Peter"
}
另一位鲍勃:
{
"_id": "89d9ffe10a33df504ecc8d7c9a99f360",
"_rev": "1-dfc3128d8d80760f2cf40328dd24553e",
"type": "user",
"name": "Bob"
}
您想要查找重复name
个值的文档。只需使用以下地图功能在name
字段上创建视图:
function (doc) {
if (doc.type == "user") {
emit(doc.name);
}
}
使用内置的_count
reduce函数。如果您使用reduce=false
查询此视图,则会得到以下结果:
{
total_rows: 3,
offset: 0,
rows: [
{
id: "89d9ffe10a33df504ecc8d7c9a975eed",
key: "Bob",
value: null
},
{
id: "89d9ffe10a33df504ecc8d7c9a99f360",
key: "Bob",
value: null
},
{
id: "89d9ffe10a33df504ecc8d7c9a98a0c6",
key: "Peter",
value: null
}
]
}
由于name
整理(排序)了这些结果,因此结果中的重复name
值将相互相邻。
或者,您可以使用group=true
查询此视图,您将获得以下结果:
{
rows: [
{
key: "Bob",
value: 2
},
{
key: "Peter",
value: 1
}
]
}
value
2
或更高的任何结果都表示存在重复项。在确定"Bob"
的密钥有重复条目后,您可以使用"Bob"
查询所有reduce=false&key="Bob"
,这将为您提供以下结果:
{
total_rows: 3,
offset: 1,
rows: [
{
id: "89d9ffe10a33df504ecc8d7c9a975eed",
key: "Bob",
value: null
},
{
id: "89d9ffe10a33df504ecc8d7c9a99f360",
key: "Bob",
value: null
}
]
}