mongoengine 中的聚合返回 $geoNear 仅作为管道中的第一阶段有效
Posted
技术标签:
【中文标题】mongoengine 中的聚合返回 $geoNear 仅作为管道中的第一阶段有效【英文标题】:Aggregation in mongoengine returns $geoNear is only valid as the first stage in a pipeline 【发布时间】:2021-05-20 12:27:23 【问题描述】:我正在尝试在聚合管道中使用 $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【问题讨论】:
您更可能滥用 mongoengine,不太可能它不支持这一点。查找相关文档,确保您遵循它,添加到问题中。 没有官方文档。除了 $geoNear 之外,所有其他阶段(如 $match 和 $project)都可以正常工作。 Mongoengine 的官方文档指出“MongoEngine 提供了一个对内置方法的包装器,并提供了一些自己的方法,这些方法被实现为在数据库服务器上执行的 javascript 代码。” 那么这个文档在哪里? docs.mongoengine.org/guide/querying.html#aggregation 【参考方案1】:正如 github 兄弟 ticket 中所解释的,MongoEngine 实际上是在向管道添加阶段,以防您在查询集上定义了跳过/限制/排序或过滤器。这可能是你的情况发生冲突的原因
【讨论】:
【参考方案2】:在 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)))
【讨论】:
以上是关于mongoengine 中的聚合返回 $geoNear 仅作为管道中的第一阶段有效的主要内容,如果未能解决你的问题,请参考以下文章
Mongoengine 中的“QuerySet”对象到底是啥?
mongoengine 是不是支持 MongoDB 中的 Transactions API?
文档中的 Mongoengine creation_time 属性