使用 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 的新手,我很难理解 map
和 reduce
函数之间的关系。我尝试修改内置的 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}
]}
如果这不是您要查找的内容,而是您只是想保留特定文本值的最新信息,那么您可以简单地找到与该文本匹配的现有文档并使用新值更新它:
在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"
]
}
我有一个 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 不知道要 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}
]}
如果这不是您要查找的内容,而是您只是想保留特定文本值的最新信息,那么您可以简单地找到与该文本匹配的现有文档并使用新值更新它:
在
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"
]
}