带有谓词函数的PyMongo查询
我在数据库里存了一系列的帖子,内容大概是这样的:
{
content: 'foo',
location: (37.423021, -122.083739)
},
{
content: 'bar',
location: (37.422473, -122.090386)
}
我还有一个叫 between
的函数,可以计算两个点之间的距离,单位是英里。它的工作原理是这样的:
>>> between((37.423021, -122.083739), (37.422473, -122.090386))
0.36649505427211615
我正在用这个函数来构建一个叫 valid
的判断函数,这个函数会接收一个文档,并返回一个布尔值,表示这个文档是否有效。这个函数大概会长这样:
def valid(document):
return between(document.location, CONSTANT_LOCATION)
那么,能不能把这个判断函数用作查询的选择器呢?
1 个回答
1
当然可以。你可以使用搜索中提供的自定义JavaScript函数来实现这个功能。注意,你需要用JavaScript来写你的代码。
可以查看一下MongoDB中的$where子句,但要记住,这样会对整个集合进行扫描。
db.myCollection.find({ $where: function() {
return (between((37.423021, -122.083739), (37.422473, -122.090386)) < 1);
}});
如果你想用haversine公式计算两个点之间的距离,可以看看我在这里分享的优化公式。
有一点我不太明白的是:你是怎么得到第一个点和第二个点的。看起来它们在不同的文档里。
编辑:这样你就不会在我提供的方法上遇到问题了。你可以把你的函数写在返回值里面,或者尝试保存你的函数(在StackOverflow上已经有人解释过怎么做了),然后用我展示的方式调用它。使用你文档中的坐标时,你需要像这样写:this.location[0]
和this.location[1]
。