使用 Distinct/Unique 值获取

Fetching With Distinct/Unique Values

我有一个 Cloudant 数据库,其中包含使用以下格式的对象:

{
  "_id": "0ea1ac7d5ef28860abc7030444515c4c",
  "_rev": "1-362058dda0b8680a818b38e9c68c5389",
  "text": "text-data",
  "time-data": "1452988105",
  "time-text": "3:48 PM - 16 Jan 2016",
  "link": "http://url/to/website"
}

我想获取 text 属性不同的对象。那里 是具有重复 text 的对象,我希望 Cloudant 处理从查询中删除它们的问题。

我如何着手创建一个 MapReduce 视图来为我执行此操作?我是 MapReduce 的新手,我很难理解 mapreduce 函数之间的关系。我尝试修改内置的 COUNT 函数并编写我自己的视图,但他们灾难性地失败了,哈哈。

无论如何,只删除重复项会更容易吗?如果是这样,我该怎么做?

虽然我正在尝试研究它并找到 ELI5,但有人可以帮助我吗?提前致谢!我很感激。

我不确定您要查找的是 MapReduce 视图。 MapReduce 视图基本上允许您获取文本和具有相同文本的文档数量,但您实际上无法获取文档中的其余字段(因为 MapReduce 不知道要 return 当多个文档匹配文本时)。这是一个示例 MapReduce 视图:

{
  "_id": "_design/textObjects",
  "views": {
    "by_text": {
      "map": "function (doc) { if (doc.text) { emit(doc.text, 1); }}",
      "reduce": "_count"
    }
  },
  "language": "javascript"
}

这是做什么的:

Map Reduce 的 Map 部分获取每个文档并将其映射到如下所示的文档中:

{"key":"text-data", "value":1}

因此,如果您有 7 个文档,其中 2 个 text="text-data" 和 5 个 text="other-text-data",数据将如下所示:

{"key":"text-data", "value":1}
{"key":"text-data", "value":1}
{"key":"other-text-data", "value":1}
{"key":"other-text-data", "value":1}
{"key":"other-text-data", "value":1}
{"key":"other-text-data", "value":1}
{"key":"other-text-data", "value":1}

MapReduce 的缩减部分 ("reduce": "_count") 将上面的文档按键和 return 计数分组:

{"key":"text-data","value":2},
{"key":"other-text-data","value":5}

您可以在您的 Cloudant 实例上查询此视图:

https://<yourcloudantinstance>/<databasename>
/_design/textObjects
/_view/by_text?group=true

这将导致类似于以下内容:

{"rows":[
  {"key":"text-data","value":2},
  {"key":"other-text-data","value":5}
]}

如果这不是您要查找的内容,而是您只是想保留特定文本值的最新信息,那么您可以简单地找到与该文本匹配的现有文档并使用新值更新它:

  1. text上添加索引:

    {
       "index": {
          "fields": [
             "text"
          ]
       },
       "type": "json"
    }
    
  2. 每当您添加新文档时,都会找到完全相同的文档 text:

    {
       "selector": {
          "text": "text-value"
       },
       "fields": [
          "_id",
          "text"
       ]
    }
    
  3. 如果存在更新它。如果没有则插入一个新文档。

最后,如果您想保留多个具有相同文本值的文档,但只想查询最新的文档,您可以这样做:

  1. 添加一个名为 latest 或与您的文档类似的 属性。
  2. textlatest 上添加索引:

    {
       "index": {
          "fields": [
             "text",
             "latest"
          ]
       },
       "type": "json"
    }
    
  3. 每当您添加新文档时,都会找到与 text 完全相同的文档,其中 latest == true:

    {
       "selector": {
          "text": "text-value",
          "latest" : true
       },
       "fields": [
          "_id",
          "text",
          "latest"
       ]
    }
    
  4. 在现有文档上设置 latest = false(如果存在)

  5. 插入新文档 latest = true

此查询将查找所有文本值的最新文档:

{
   "selector": {
      "text": {"$gt":null}
      "latest" : true
   },
   "fields": [
      "_id",
      "text",
      "latest"
   ]
}