繁体   English   中英

CouchDB / PouchDB将值传递给MapReduce

[英]CouchDB / PouchDB Pass values to MapReduce

因此,我在使用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。 我有点卡在这里。

拥有使x和y参数更易于访问的“ createReduce”函数是否足够?

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

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

就是说,这里有一些有用的基于过滤器的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变量用于实现Hi-DPI(视网膜)显示兼容性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM