我有一个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的新手,很难理解map
和reduce
函数之间的关系。我试着修改内置的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}
]}
如果这不是你想要的,而是你只想保留特定文本值的最新信息,那么你可以简单地找到一个与该文本匹配的现有文档,并用新值更新它:
在
text
:上添加索引{ "index": { "fields": [ "text" ] }, "type": "json" }
无论何时添加新文档,都可以找到具有相同
text
:的文档{ "selector": { "text": "text-value" }, "fields": [ "_id", "text" ] }
如果它存在,请更新它。如果不存在,则插入一个新文档。
最后,如果你想保留多个具有相同文本值的文档,但只想查询最新的文档,你可以这样做:
- 在文档中添加一个名为
latest
或类似的属性 在
text
和latest
:上添加索引{ "index": { "fields": [ "text", "latest" ] }, "type": "json" }
无论何时添加新文档,都可以找到具有相同
text
的文档,其中latest == true
:{ "selector": { "text": "text-value", "latest" : true }, "fields": [ "_id", "text", "latest" ] }
在现有文档(如果存在)上设置
latest = false
插入带有
latest = true
的新文档
此查询将查找所有文本值的最新文档:
{
"selector": {
"text": {"$gt":null}
"latest" : true
},
"fields": [
"_id",
"text",
"latest"
]
}