【问题标题】:CouchDB / PouchDB Pass values to MapReduceCouchDB / PouchDB 将值传递给 MapReduce
【发布时间】:2013-11-09 10:37:27
【问题描述】:

所以,我在使用 PouchDB 和 MapRepduce 搜索 HTML5 画布中的持久图形对象方面有点创意。 (我试图用简单的边界框逻辑判断用户是否点击了该对象)那部分并不是那么重要;这可能很愚蠢,但我只想这样做,因为我就是这样的傻瓜。

也就是说,我想将一对自定义值传递给我的 PouchDB 查询的 reducer 函数。我不确定该怎么做,确切地说。

这是我现在正在做的事情:

var x = evt.clientX, y = evt.clientY

var map = function (doc) {
  emit('bbox',
    {
      x0: doc.x,
      x1: doc.x + doc.w,
      y0: doc.y,
      y1: doc.y + doc.h
    }
  )
}

var reduce = function (keys, values, rereduce) {
  return values.forEach(function (bbox) {
    if (x >= bbox.x0 && x < bbox.x1 && y >= bbox.y0 && y < bbox.y1) {
      return true
    }
  })
}

var result = db.px.query({map: map, reduce: reduce}, function (err, rsp) {
  cb(rsp)
})

它现在不起作用,因为 reduce 函数无法访问 x 和 y 值,因为出于某种原因,它们无法从函数运行的范围内访问。所以,我认为,我需要通过该查询方法将它们传递给 Pouch/Couch。我有点卡在这里。

【问题讨论】:

    标签: javascript mapreduce couchdb pouchdb


    【解决方案1】:

    难道不应该有一个“createReduce”函数使 x 和 y 参数更易于访问吗?

    var createReduce = function(x,y) { return function(keys, values, rereduce) {...} }
    

    【讨论】:

    • mapreduce 函数都是.toString'd 然后eval'd 使发射方法在它们内部可用(source)。这会丢弃最初定义它们的任何上下文,因此这不起作用。
    • @chesles 我想我正在尝试做的事情永远不可能做到。在这种情况下,我将使用二十一点和水烟制作我自己的客户端数据库。感谢您的洞察力。
    • @CryptoQuick 是的,它听起来不像 map-reduce 特别适合你想要做的事情。但是,您可能可以使用诸如 leveldb 之类的东西来完成此操作——正确地制作您的数据库键,并且一个简单的范围查询可能会很好地工作。查看 leveluplevel.js 以获取它的浏览器后端。
    【解决方案2】:

    似乎我正在尝试做不可能的事情,而且我真的不需要这个特定应用程序的持久性。此外,更复杂的面向图形的空间查询将需要更专业的数据持久性和操作框架。我以后会做这样的事情。

    也就是说,这里有一些有用的基于过滤器的 bbox 代码,可以帮助那些可能在未来走上我自己道路的勇敢的编码员。

    var db = {
      // 2d, canvas-related data store and methods
      px: {
        store: [],
        add: function (obj) {
          db.px.store.push(obj)
        },
        pick: function (x, y) {
          return db.px.store.filter(function (obj) {
            return x >= obj.x
              && x < obj.x + obj.w * gfx.px.ratio
              && y >= obj.y
              && y < obj.y + obj.h * gfx.px.ratio
          })
        }
      }
    }
    

    这适用于格式如下的图形对象:

    {
      x: 0, y: 0, w: 0, h: 0
    }
    

    我希望这对将来尝试做我正在做的事情的人有所帮助。

    此外,gfx.px.ratio 变量用于高 DPI(视网膜)显示兼容性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      相关资源
      最近更新 更多