Mongodb对数组的空间查询

时间:2014-07-24 15:48:28

标签: mongodb mongodb-query

我有一系列带有属性的点,我跟踪它们随时间移动的位置,因此文档如下:

{
    _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吗?

2 个答案:

答案 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/

现在这看起来像是一些自定义编码。我还要仔细研究一下,将每个时间/位置对存储为单独的文档是否会更好。例如,您可以获取某个点的第一个时间/位置,计算距离,然后查询该点是否有任何时间/位置对,其距离小于您刚刚计算的距离。