识别CouchDB中的重复项

jbo*_*pez 6 perl json couchdb mapreduce couchdb-futon

我是CouchDB和面向文档的数据库的新手.

我一直在玩CouchDB,并且能够熟悉创建文档(使用perl)并使用Futon中的Map/Reduce函数来查询数据和创建视图.

我还想弄清楚的一件事是如何使用Futon的Map/Reduce来识别文档中的重复值.

例如,如果我有以下文件:

{
  "_id": "123",
  "name": "carl",
  "timestamp": "2012-01-27T17:06:03Z"
}

{
  "_id": "124",
  "name": "carl",
  "timestamp": "2012-01-27T17:07:03Z"
}
Run Code Online (Sandbox Code Playgroud)

我想获得一个具有重复"名称"值的文档ID列表,这是我可以用Futon Map/Reduce做的事情吗?

结果希望实现如下:

{
  "name": "carl",
  "dupes": [ "123", "124" ]
}
Run Code Online (Sandbox Code Playgroud)

..要么..

{
  "carl": [ "123", "124" ]
}
Run Code Online (Sandbox Code Playgroud)

..这将是值,以及包含这些重复值的关联文档ID.

我已经尝试了Map/Reduce的一些不同的东西,但据我所知,Map函数在每个文档的基础上处理数据,而Reduce函数只允许你使用给定的键/值文献.

我知道我可以用Perl提取我需要的数据,在那里工作魔法,并得到我想要的结果,但我现在只想使用CouchDB来更好地理解它的好处/局限性.

我正在考虑这样做的另一种方法是使用像RDBMS表这样的单个文档:

{
  "_id": "names",
  "rec1": {
    "_id": "123",
    "name": "carl",
    "timestamp": "2012-01-27T17:06:03Z"
  },
  "rec2": {
    "_id": "124",
    "name": "carl",
    "timestamp": "2012-01-27T17:07:03Z"
  }
}
Run Code Online (Sandbox Code Playgroud)

..这应该允许我按照我最初的想法使用Map/Reduce函数.但是我不确定这是否理想.

我知道我的思想仍然停留在RDBMS的土地上,所以我上面尝试做的很多事情可能都没有必要.任何有关这方面的见解将非常感激.

谢谢!

编辑:修复了一些示例中的JSON语法.

Dom*_*nes 7

如果您只想要一个唯一值列表,那很容易.如果您希望识别重复项,那么它就变得不那么容易了.

在这两种情况下,像这样的地图函数应该足够了:

function (doc) {
   emit(doc.name);
}
Run Code Online (Sandbox Code Playgroud)

对于reduce功能,只需输入即可_count.

您的视图输出将如下所示:(基于您的2个文档)

{
    "rows": [
        { "key": "carl", "value": 2 }
    ]
}
Run Code Online (Sandbox Code Playgroud)

从那里,您将获得一个名单及其频率列表.您可以获取该列表并自行过滤,或者您可以采用"所有沙发"路线并使用_list函数执行最终过滤.

function (head, req) {
    var row, duplicates = [];
    while (row = getRow()) {
        if (row.value > 1) {
            duplicates.push(row);
        }
    }
    send(JSON.stringify(duplicates));
}
Run Code Online (Sandbox Code Playgroud)

阅读有关_list功能,它们非常方便和多功能.