在CouchDb中查找重复值

时间:2015-11-19 19:14:56

标签: couchdb couchdb-futon

我想在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或仅在地图完成时调用?

1 个答案:

答案 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
    }
  ]
}