基于数组的Mongodb空间查询
我有一个点及其属性的集合,我跟踪它们随时间移动的位置,因此文档如下所示:基于数组的Mongodb空间查询,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个点及其属性的集合,我跟踪它们随时间移动的位置,因此文档如下所示: { _id: 1, mass: 2, track: [ { time: 0, loc: [0, 0] }, { time: 1, loc: [0.2, 0.1] }, ... ] } 所以位置不是一个字段,而是一个数
{
_id: 1,
mass: 2,
track: [
{
time: 0,
loc: [0, 0]
},
{
time: 1,
loc: [0.2, 0.1]
},
...
]
}
所以位置不是一个字段,而是一个数组…我可以使用mongodb的地理空间功能来查找在某个特定点附近移动的所有点吗?我可以为这个查询添加时间吗:
t1
?是的-这正是mongodb可以做得很好的地方
首先,您需要创建一个地理空间索引——让Mongodb预先计算东西的位置
db.mycollection.ensureIndex({'track.loc':'2D'})
更多信息请点击此处:
然后,找到某个地方附近的某个地方:
db.mycollection.findOne({'track.loc':{'$near':[x,y]}})
还有在边界区域内执行此操作的选项等
如果要结合时间过滤器执行此操作:
db.mycollection.findOne({'track.loc':{'$near':[x,y]}, 'track.time':{$gt:10}})
这将找到距离时间大于10的x,y最近的点
希望你没有侵犯任何人的隐私 是的,在MongoDB中使用地理空间索引时,有一种特殊情况,称为多位置文档: 用于二维索引的多位置文档 版本2.0中的新增功能:支持文档中的多个位置 而二维地理空间索引不支持多组索引 在文档的坐标中,可以使用多键索引进行索引 单个文档中有多个坐标对 对于多位置,支持多种不同的模式-您的数据模型似乎映射良好。您应该能够使用以下“确保索引”命令:
db.collectionname.ensureIndex( { "track.loc": "2d" } )
但是,关于您的查询,不确定您是否可以使用此模式在MongoDB中进行查询。问题在于,您实际上是在尝试相互比较数组条目(比较时间字段以在同一数组中找到一个大于另一个的时间字段)。您可以尝试使用聚合框架,但在使用地理空间坐标时存在明显的限制:
现在在我看来,这就像一些自定义编码。我将仔细研究是否最好将每个时间/位置对存储为单独的文档。例如,您可以获取一个点的第一个时间/位置,计算距离,然后查询该点是否有距离小于您刚才计算的距离的时间/位置对。这不会只返回
loc
数组中靠近点(x,y)的元素,而是返回整个文档。您知道有什么方法可以只返回数组中的close-by元素吗?