我有一系列带有属性的点,我跟踪它们随时间移动的位置,因此文档如下:
{
_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
吗?
答案 0 :(得分: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。
希望您不要侵犯任何人的隐私!
答案 1 :(得分:0)
是的,当使用MongoDB的地理空间索引时,有一个特殊情况 - 它被称为多位置文档:
二维索引的多地点文档
2.0版中的新功能:支持文档中的多个位置。
虽然2d地理空间索引不支持多组 在文档中的坐标,可以使用多键索引进行索引 单个文档中的多个坐标对。
http://docs.mongodb.org/manual/core/geospatial-indexes/#GeospatialIndexing-MultilocationDocuments
对于多位置支持多种不同的模式 - 您的数据模型似乎可以很好地映射。您应该能够使用以下ensure index命令:
db.collectionname.ensureIndex( { "track.loc": "2d" } )
关于您的查询,但不确定您是否可以使用此架构在MongoDB中执行此操作。问题在于您实际上是在尝试将数组条目相互比较(比较时间字段以在同一数组中找到一个大于另一个的时间字段)。您可以尝试使用聚合框架,但它在使用地理空间坐标时存在很大的局限性:
http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/
现在这看起来像是一些自定义编码。我还要仔细研究一下,将每个时间/位置对存储为单独的文档是否会更好。例如,您可以获取某个点的第一个时间/位置,计算距离,然后查询该点是否有任何时间/位置对,其距离小于您刚刚计算的距离。