2014-07-24 90 views
0

空间查询我有自己的属性点的集合,我跟踪他们的位置,因为他们有时间运动,所以文件是这样的:的MongoDB在阵列

{ 
    _id: 1, 
    mass: 2, 
    track: [ 
     { 
      time: 0, 
      loc: [0, 0] 
     }, 
     { 
      time: 1, 
      loc: [0.2, 0.1] 
     }, 
     ... 
    ] 
} 

所以没有一个单一的领域位置,但一个数组...
我可以使用mongodb的地理空间功能来查找碰巧在特定点附近移动的所有点|[x,y] - [x0,y0]| < R?我可以添加时间到这个查询:t1 < t < t2, |[x,y] - [x0,y0]| < R

回答

1

是的 - 这正是mongodb可以做得很好。

首先,您需要创建一个地理空间索引 - 让Mongodb预先计算东西在哪里。

db.mycollection.ensureIndex({'track.loc':'2D'}) 

点击此处了解详情: http://docs.mongodb.org/manual/core/2d/

然后,找到附近的某个地方某一个地方:

db.mycollection.findOne({'track.loc':{'$near':[x,y]}}) 

还有选项以边界地区等

如果内做到这一点你想要结合时间过滤器来做到这一点:

db.mycollection.findOne({'track.loc':{'$near':[x,y]}, 'track.time':{$gt:10}}) 

这会找到你最近的点为x,y这里的时间大于10

希望你没有侵犯任何人的隐私!

0

是的,有使用MongoDB的具有地理空间索引时这种特殊情况 - 它被称为一个多地点文件:

多地点的文档的2D指标

新版本2.0:支持文档中的多个位置。

尽管2d地理空间索引不支持文档中的多个坐标集合,但您可以使用多键索引在单个文档中将多个坐标对编制索引 。

http://docs.mongodb.org/manual/core/geospatial-indexes/#GeospatialIndexing-MultilocationDocuments

有针对多点几个不同的模式支持 - 你的数据模型看起来很好地映射。您应该能够使用以下确保索引命令:

db.collectionname.ensureIndex({ "track.loc": "2d" }) 

关于您的查询,但不确定您可以使用此模式在MongoDB中执行此操作。问题在于你试图比较数组条目(比较时间字段在同一个数组中找到一个大于另一个的时间字段)。您可以尝试使用聚合框架,但也有它的使用显著限制与地理空间坐标:

http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/

眼下这在我看来就像一些定制编码。而且我会仔细研究一下将每个时间/位置对作为单独文档存储是否更好。例如,您可以抓住某个点的第一次/位置,计算距离,然后查询是否有距离小于刚刚计算的点的时间/位置对。