Javascript CouchDB/DB将值传递给MapReduce

Javascript CouchDB/DB将值传递给MapReduce,javascript,mapreduce,couchdb,pouchdb,Javascript,Mapreduce,Couchdb,Pouchdb,所以,我在使用PockDB和MapRepduce搜索HTML5画布中的持久图形对象方面有点创造性。(我试图告诉用户是否使用简单的边界框逻辑单击了该对象)该部分并不那么重要;这可能很傻,但我只是想这么做,因为我是那样的傻瓜 也就是说,我想将一对自定义值传递给我的数据库查询的reducer函数。我确实不知道该怎么做 以下是我现在正在做的事情: var x = evt.clientX, y = evt.clientY var map = function (doc) { emit('bbox',

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

也就是说,我想将一对自定义值传递给我的数据库查询的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)
})
var x=evt.clientX,y=evt.clientY
变量映射=函数(doc){
发出('bbox',
{
x0:doc.x,
x1:x号文件+w号文件,
y0:y博士,
y1:y号文件+h号文件
}
)
}
var reduce=函数(键、值、重减量){
返回值。forEach(函数(bbox){
如果(x>=bbox.x0&&x=bbox.y0&&y

它现在不起作用,因为reduce函数无法访问x和y值,因为出于某种原因,它们在函数运行的范围内是不可访问的。所以,我想,我需要通过这个查询方法将它们传递给pocky/coach。我有点被困在这里。

有一个“createReduce”函数,使x和y参数更容易访问,难道还不够吗

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

看起来我是在尝试做不可能的事情,我真的不需要这个特定应用程序的持久性。此外,更复杂的面向图形的空间查询将需要更专门的数据持久性和操作框架。我将来会做这样的事情

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
      })
    }
  }
}
也就是说,这里有一些有用的基于过滤器的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
      })
    }
  }
}
我希望这对任何想做我将来要做的事情的人都有帮助

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
      })
    }
  }
}

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

map
和reduce函数都是
。toString
'd然后
eval
'd使其内部的发射方法可用()。这就抛弃了它们最初定义的任何上下文,所以这是行不通的。@chesles我想我要做的是永远做不到的事情。在这种情况下,我将建立自己的客户端数据库,包括21点和水烟。谢谢你的见解。@CryptoQuick是的,这听起来不像map reduce特别适合你要做的事情。但是,您可能可以使用leveldb之类的工具来实现这一点—正确地设计数据库键,一个简单的范围查询可能会很好地工作。签出并获取它的浏览器后端。