2013-11-09 61 views
0

因此,我在使用PouchDB和MapRepduce搜索HTML5画布中的持久图形对象方面有点创意。 (我试图告诉用户是否用简单的边界框逻辑单击了该对象)该部分并不是那么重要;这可能很愚蠢,但我只是想做到这一点,因为我是一个这样的人。CouchDB/PouchDB将值传递给MapReduce

这就是说,我想将一对自定义值传递给我的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) 
}) 

它不工作,因为现在的减少功能无法访问,因为x和y的值,因为某些原因,他们无法访问从功能运行的范围来看。所以,我想通过查询方法,我需要将它们传递给Pouch/Couch。我有点卡在这里。

回答

0

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

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

0

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

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

'map'和'reduce'函数都是'.toString''d然后'eval''d使放射方法在里面可用([source](https://github.com/daleharvey/pouchdb) /blob/master/src/plugins/pouchdb.mapreduce.js#L109-L118))。这抛弃了它们最初定义的任何上下文,所以这不起作用。 – chesles

+0

@chesles我想我要做的是永远不可能做的事情。在那种情况下,我会用二十一点和水烟袋制作我自己的客户数据库。感谢您的见解。 –

+1

@CryptoQuick是的它听起来不像map-reduce特别适合你想要做的事情。但是,您可以通过像使数据库密钥正确并且简单的范围查询可能工作得很好的方式来完成此任务。查看[levelup](https://github.com/rvagg/node-levelup)和[level.js](https://github.com/maxogden/level.js)浏览器的后端。 – chesles