mongoengine 中的聚合返回 $geoNear 仅作为管道中的第一阶段有效

时间:2021-02-17 15:23:44

标签: python-3.x mongodb pymongo mongoengine

我正在尝试在聚合管道中使用 $geoNear

从 mongo shell 运行它同样可以正常工作:

db.base_model.aggregate([{$geoNear: {near: {type: "Point", coordinates: [10.634584, 35.8245029]}, distanceField: "coordinates"}}])

但是像这样使用 mongoengine 运行

model.objects.aggregate(*[{"$geoNear": {"near": {"type": "Point", "coordinates": [10.634584, 35.8245029]}, "distanceField": "coordinates"}}]) 

返回以下错误 $geoNear 仅作为管道中的第一阶段有效,即使 $geoNear 是管道中的唯一阶段。知道为什么会这样吗?

使用:

  • mongoengine: 0.17.0
  • MongoDB 服务器版本:4.4.0

2 个答案:

答案 0 :(得分:0)

如 github 兄弟 ticket 中所述,MongoEngine 实际上是向管道添加阶段,以防您在查询集上定义了跳过/限制/排序或过滤器。这可能是你的情况发生冲突

答案 1 :(得分:0)

一个在 mongoengine 下运行的 $geoNear 示例。

from mongoengine import *

connect()


class Aggr(Document):
    name = StringField()
    c = PointField()


Aggr(name='X', c=[10.634584, 35.8245029]).save()
Aggr(name='Y', c=[10.634584, 35.8245029]).save()

pipeline = [
    {"$geoNear": {
        "near": {"type": "Point", "coordinates": [10.634584, 35.8245029]}, "distanceField": "c",
        "spherical": True
    }}
]
print(list(Aggr.objects.aggregate(*pipeline)))