Mapreduce 如何编写基于时间戳的map/reduce视图以避免CouchDB中的更新?
我试图在CouchDB中“避免更新”,这似乎是我的建议。 但是我很难创建只返回最新值的“reduce”视图。在下面的数据集中,文档Mapreduce 如何编写基于时间戳的map/reduce视图以避免CouchDB中的更新?,mapreduce,couchdb,cloudant,Mapreduce,Couchdb,Cloudant,我试图在CouchDB中“避免更新”,这似乎是我的建议。 但是我很难创建只返回最新值的“reduce”视图。在下面的数据集中,文档A8F2298E5961B0EBF60E56002D253D2B(其中s=FooQuux)基本上不应返回,可以作为“清理”操作删除而不产生影响 我希望能够进行以下操作: 检索a==>Bar 可以工作,使用s视图,搜索[[[“a”],[“a”,{}],限制为1 检索所有值==>a=Bar,b=qux 我可以写一个reduce来“删除”具有较旧时间戳的文档吗
A8F2298E5961B0EBF60E56002D253D2B
(其中s=FooQuux)基本上不应返回,可以作为“清理”操作删除而不产生影响
我希望能够进行以下操作:
- 检索
==>a
Bar
- 可以工作,使用
视图,搜索s
,限制为1[[[“a”],[“a”,{}]
- 可以工作,使用
- 检索所有值==>
a=Bar,b=qux
- 我可以写一个reduce来“删除”具有较旧时间戳的文档吗
- 获取每个用户的字符串长度-group=1=
(不包括fooqux)a=3,b=4
- 获取所有用户的字符串长度-group=None==
(不包括fooqux)7
数据:(这是一个人为的例子) 给定数据:(其中t是时间戳,u是用户名,s是字符串)
- 在时间戳0处,用户
设置值a
fooqux
- 在时间戳1处,用户
设置值a
Bar
- 在时间戳2处,用户
设置值b
qux
{
"_id": "_design/all",
"views": {
"s": {
"map": "function(doc) { if(doc.u) { emit([doc.u, doc.s, doc.t], doc.s); } }"
},
"slen": {
"map": "function(doc) { if(doc.u) { emit([doc.u, doc.s, doc.t], doc.s.length); } }",
"reduce": "_sum"
}
},
"language": "javascript"
}
{
"_id": "a8f2298e5961b0ebf60e56022d251ebd",
"t": 2,
"u": "b",
"s": "Quux"
}
{
"_id": "a8f2298e5961b0ebf60e56022d253a1b",
"t": 1,
"u": "a",
"s": "Bar"
}
{
"_id": "a8f2298e5961b0ebf60e56022d253d2b",
"t": 0,
"u": "a",
"s": "FooQuux"
}
通过创建如下映射函数:
功能(doc){
发射([doc.u,doc.t],doc.s);
}
您可以通过两种方式使用该视图:
- 要聚合数据,请获取u值的文档数计数(使用_countreducer和
)?group_level=1
- 选择值为
-(u
)的最新记录reduce=false&endkey=[“a”]&startkey=[“az”]&descending=true&limit1
{
"value": {
"a": {
"s": "Bar",
"t": 1
},
"b": {
"s": "Quux",
"t": 2
}
},
"key": null
}
谢谢我认为您的第二个项目符号与为特定值选择最新项目符号类似。有没有办法为所有值选择最新值?这是减速器可以做到的吗?考虑到这一点,我可能可以像在我的其他评论中一样使用此视图-但是我可以将您提供的地图缩减为我在其他评论中提到的格式吗?我想我可以试试!好的,所以我还没有尝试过这个…但是我只是有一个想法,我可以制作一个像上面那样的地图(
[u,s,t]
),但是使用类似这样的文档:{a:{t:1,s:“Bar”}}…然后reduce可以收集密钥,扔掉旧的。所以group=None应该是{a:{s:Bar,t:1},b:{s:quox,t:2}},其他组级别应该如预期的那样工作……但是对于获取单个“u”,上面的limit=1方法最好,因为它不需要reduce。阿米丽特?
function(keys, values, rereduce){
function rollin(map, u, o) {
if((!map[u]) || (o.t > map[u].t)) {
return o;
} else {
return map[u];
}
return map;
}
var m = {};
for(var i=0;i<values.length;i++) {
var v = values[i];
if(rereduce) {
// merge in this chunk
for(var u in v) {
m[u] = rollin(m, u, v[u]);
}
} else {
// roll in single entries
m[keys[i][0][0]] = rollin(m, keys[i][0][0], {
s: v,
t: keys[i][0][1],
});
}
}
return m;
}
{
"value": "Bar",
"key": [
"a",
1
],
"id": "a8f2298e5961b0ebf60e56022d253a1b"
}
{
"value": {
"b": {
"s": "Quux",
"t": 2
}
},
"key": [
"b"
]
}
{
"value": {
"a": {
"s": "Bar",
"t": 1
}
},
"key": [
"a"
]
}
{
"value": {
"a": {
"s": "Bar",
"t": 1
},
"b": {
"s": "Quux",
"t": 2
}
},
"key": null
}