带有谓词函数的PyMongo查询

0 投票
1 回答
1267 浏览
提问于 2025-04-18 00:29

我在数据库里存了一系列的帖子,内容大概是这样的:

{
    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]

撰写回答