Mapreduce 如何编写基于时间戳的map/reduce视图以避免CouchDB中的更新?

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来“删除”具有较旧时间戳的文档吗

我试图在CouchDB中“避免更新”,这似乎是我的建议。 但是我很难创建只返回最新值的“reduce”视图。在下面的数据集中,文档
A8F2298E5961B0EBF60E56002D253D2B
(其中s=FooQuux)基本上不应返回,可以作为“清理”操作删除而不产生影响

我希望能够进行以下操作:

  • 检索
    a
    ==>
    Bar
    • 可以工作,使用
      s
      视图,搜索
      [[[“a”],[“a”,{}]
      ,限制为1
  • 检索所有值==>
    a=Bar,b=qux
    • 我可以写一个reduce来“删除”具有较旧时间戳的文档吗
对于最后两个,我不确定是否有可能编写一个map/reduce视图,在给定约束的情况下,这两个视图都可以

  • 获取每个用户的字符串长度-group=1=
    a=3,b=4
    (不包括fooqux)
  • 获取所有用户的字符串长度-group=None==
    7
    (不包括fooqux)

数据:(这是一个人为的例子)

给定数据:(其中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
    )的最新记录
由于在索引过程中文档是单独处理的,因此不可能执行要求您了解另一个文档内容的逻辑。i、 e.如果(doc.live){emit(doc.u,null)},您可以防止文档在索引时被索引。,但您不能执行“跨文档”逻辑。

不尝试,但这里有一个可能的解决方案:

地图 每只@Glynn鸟

减少 减少,组级别1 这用于列出“特定值”(通过查询选择)

减少,组级别无 这是用来倾倒所有物品的

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