获取不同/唯一值

时间:2016-04-12 05:00:16

标签: mapreduce cloudant

我有一个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函数并编写自己的视图,但他们已经发生了灾难性的失败,哈哈。

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

虽然我正在尝试研究这个并找到ELI5s,但有人会帮助我吗?提前致谢!我很感激。

1 个答案:

答案 0 :(得分:1)

我不确定MapReduce视图是您正在寻找的。 MapReduce视图基本上允许您获取具有相同文本的文本和文档数量,但您实际上无法获取文档中的其余字段(因为MapReduce不知道在哪个文档返回时多个文档与文本匹配)。以下是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-data”,5个文本=“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")的reduce部分按键将上述文档分组并返回计数:

{"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. 如果存在则更新它。如果没有,则插入新文件。

  4. 最后,如果您想保留多个具有相同文本值的文档,但只想查询最新文档,您可以执行以下操作:

    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

    6. 插入新文档

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

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