具有文本搜索的Mongoengine地理空间查询无法按预期工作

时间:2014-06-01 17:15:52

标签: mongodb pymongo mongoengine

以下是我的疑问:

items = Item.objects(
                    location__near=[item_obj.longitude, item_obj.latitude],
                    location__max_distance=item_obj.range,
                    status__status=ITEM_STATUS_DISPLAYED
                ).filter(
                    Q(title__icontains=item_obj.search) |
                    Q(description__icontains=item_obj.search
                )
            ).hint([('location', '2dsphere')])

此查询似乎不起作用,因为返回范围之外的对象。项目状态似乎也被忽略了。范围以米为单位。

奇怪的是以下查询没有任何问题:

items = Item.objects(
                    location__near=[item_obj.longitude, item_obj.latitude],
                    location__max_distance=item_obj.range,
                    status__status=ITEM_STATUS_DISPLAYED
                )

我不确定是什么问题。

1 个答案:

答案 0 :(得分:0)

我建议您远离$ near句柄,因为mongoengine正在使用对PyMongo的弃用调用,如果您将mongoDB更新到最新版本,您的应用程序将失败。

我所做的是使用geo_within查询,特别是geo_within_sphere,因为我在地球上的位置周围的圆圈内找到点。您可以在此处找到参考:MongoEngine geo query

他们在那里解释的一件事是转换半径。如果你使用Km,那么你必须做半径/ 6371.0如果你使用里程然后半径/ 3959.0

我的查询如下:

data = data_set.objects(
           location__geo_within_sphere=[[longitude, latitude], radius/6371.0]
       )