【问题标题】:Database error from mongoengine max_distance query来自 mongoengine max_distance 查询的数据库错误
【发布时间】:2014-10-10 02:50:19
【问题描述】:

您好,我在使用 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 shell 我添加一行:

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

我连接到 mongodb 并从 shell 我尝试使用 $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>

【问题讨论】:

    标签: python django pymongo mongoengine


    【解决方案1】:

    这更像是一个提示,但是:

    $near MongoDB 中的运算符有两个子句:$geometry$maxDistance(这就是您在 Mongo shell 中的调用方式)。但看起来您的自定义对象尝试仅使用 $geometry 作为参数来实例化 $near 子句。

    所以不是tracks__location__max_distance,而是tracks__location__near__max_distance 之类的东西(即max_distance 应该在$near 子句内)。

    【讨论】:

    • $maxDistance 必须在 $geometry 子句中,而不是在 $near 中。我得到的这个问题意味着 $maxDistance 在 $near 子句中。在 mongo shell 中:&gt; db.alarm.find({'tracks.location': {$near: {$geometry: {"type": "Point", coordinates: [18.068611, 59.329444]}}, $maxDistance: 810999}}) error: { "$err" : "Can't canonicalize query: BadValue geo near accepts just one argument when querying for a GeoJSON point. Extra field found: $maxDistance: 810999.0", "code" : 17287 }
    • @gameboy 的评论解决了我的疑问。 $maxDistance 必须在 $geometry 子句中,而不是在 $near 子句中。
    猜你喜欢
    • 2020-02-17
    • 2015-11-20
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多