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 编写一个空的 dict 字段

文档中的 Mongoengine creation_time 属性

如何在 Python 中使用 MongoEngine 查询 MongoDB 中的特定文档?

mongoengine中queryset触发网络访问机制剖析