mongoengine max_distance 查询的数据库错误

1 投票
1 回答
1030 浏览
提问于 2025-04-18 17:30

你好,我在使用mongoengine查询数据时遇到了问题。我尝试按照文档中的方法操作,但出现了问题。

我创建了两个模型。

class Alarm(mongoengine.Document):
    added = mongoengine.DateTimeField()
    title = mongoengine.StringField()
    tracks = mongoengine.ListField(mongoengine.EmbeddedDocumentField(Track))

    meta = {
        'indexes': [[("tracks.location", "2dsphere")]]
    }

class Track(mongoengine.EmbeddedDocument):
    created_on = mongoengine.DateTimeField()
    location = mongoengine.PointField()

然后在django的命令行中添加了一条记录:

db.alarm.insert({"title": "Warszawa", "tracks": [{"location": {"type": "Point", "coordinates": [21.01666, 52.233333]}}]})

我连接到mongodb,并在命令行中尝试使用$near查找我的新位置:

>db.alarm.find({'tracks.location': {$near: {$geometry: {"type": "Point", coordinates: [18.068611, 59.329444]}, $maxDistance: 810997}}})
>


> db.alarm.find({'tracks.location': {$near: {$geometry: {"type": "Point", coordinates: [18.068611, 59.329444]}, $maxDistance: 810998}}})
{
 "_id" : ObjectId("53ef89626dda06655a57a342"), "title" : "Warszawa",
"tracks" : [ { "location" : { "type" : "Point", "coordinates" : [
21.01666, 52.233333 ] } } ] }

返回的结果是我预期的。第一次查询没有返回任何结果,第二次找到了我的位置。

但是我无法通过mongoengine得到相同的结果。

Alarm.objects(tracks__location__near = {"coordinates":[ 21.01666, 52.233333 ] , "type": "Point"}, tracks__location__max_distance=810998)

我得到的是:

<repr(<mongoengine.queryset.queryset.QuerySet at 0x7ff3a50e8a10>) failed: pymongo.errors.OperationFailure: database error: Can't canonicalize query: BadValue geo near accepts just one argument when querying for a GeoJSON point. Extra field found: $maxDistance: 810998>

1 个回答

1

这更像是一个提示,不过:

在MongoDB中,$near操作符有两个子部分:$geometry$maxDistance(在Mongo shell中是这样称呼的)。但是看起来你自定义的对象只用$geometry作为参数来实例化$near子部分。

所以应该不是tracks__location__max_distance,而是类似于tracks__location__near__max_distance的东西(也就是说,max_distance应该放在$near子部分里面)。

撰写回答