我是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,它会更快。
答案 0 :(得分:0)
与$near
结合使用$maxDistance
是最推荐的方式
db.collectionName.find({loc:{$ near:[50,50],$ maxDistance:5}});
对于性能问题,您可以尝试创建索引,如下所述:
要为GeoJSON格式的数据创建地理空间索引,请使用ensureIndex()方法并将集合的位置字段值设置为2dsphere。
db.points.ensureIndex({loc:“2dsphere”});
了解更多信息: