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

问题描述

我正在尝试在聚合管道中使用 $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,"distanceField": "coordinates"}}]) 

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

使用:

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

解决方法

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

,

一个在 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',35.8245029]).save()

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...