如何查找附近的活动或推文

时间:2014-04-10 07:44:54

标签: mongodb coordinates

我是NoSQL数据库的新手,我遇到了一个相当基本的问题。

我在MongoDB数据库中有一组推文,我通过Mongo shell和pyMongo查询。这些文件类似于:

{ loc : { lng : 40, lat : 3 },
  timestamp : 124125512,
  userid = 55 }

我需要找到彼此接近的事件的所有用户对,并且差异小于4小时。最天真的方式是:

db.tweets.find().forEach(function(tweet)
{
    found = db.tweets.find({ "timestamp": { "$gt" : tweet['timestamp'] - 60*60*4, 
                                            "$lt" : tweet['timestamp'] + 60*60*4},
                             "loc" : {"$near" : [ tweet['loc']['lng'], 
                                                  tweet['loc']['lat'] ], 
                                      "$maxDistance" : 500 }
                              });

    //... extract the users from those tweets...
}

这当然非常慢(它可以包含多达几百万条推文)。

我无法使用聚合和MapReduce来表达此查询。你会怎么做?进行此类查询的NoSQL-y,高效且清晰的方法是什么?

编辑:我有点放弃了。我被一位朋友说服了,因此使用Mongo并不值得。我可以利用时间限制来避免迭代整个集合,并在一个简单的,更传统的迭代脚本中完成。由于它不是一个巨大的数据集,不适合RAM,它会更快。

1 个答案:

答案 0 :(得分:0)

$near结合使用$maxDistance是最推荐的方式

  

db.collectionName.find({loc:{$ near:[50,50],$ maxDistance:5}});

对于性能问题,您可以尝试创建索引,如下所述:

要为GeoJSON格式的数据创建地理空间索引,请使用ensureIndex()方法并将集合的位置字段值设置为2dsphere。

  

db.points.ensureIndex({loc:“2dsphere”});

了解更多信息: