我有一个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函数并编写自己的视图,但他们已经发生了灾难性的失败,哈哈。
无论如何,删除重复项会更容易吗?如果是这样,我该怎么做?
虽然我正在尝试研究这个并找到ELI5s,但有人会帮助我吗?提前致谢!我很感激。
答案 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}
]}
如果这不是您想要的,而是您只是想保留特定文本值的最新信息,那么您只需找到与该文本匹配的现有文档并使用新值更新它:
在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"
]
}