使用不同/唯一值提取



我有一个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不知道当多个文档与文本匹配时返回哪个文档)。以下是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="文本数据",5个为text="其他文本数据"的文档,则数据将如下所示:

{"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. 如果它存在,请更新它。如果不存在,则插入一个新文档。

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

  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"
   ]
}

相关内容

  • 没有找到相关文章

最新更新