【问题标题】:Aggregation in mongoengine returns $geoNear is only valid as the first stage in a pipelinemongoengine 中的聚合返回 $geoNear 仅作为管道中的第一阶段有效
【发布时间】: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 代码。”
  • 那么这个文档在哪里?

标签: python-3.x mongodb pymongo mongoengine


【解决方案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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-27
      • 2019-06-03
      • 2019-03-03
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多