dongyan5815 2019-09-10 16:15
浏览 349
已采纳

Mongo Go驱动程序的DocumentCount不支持$ nearSphere

I am working on geo location query where I want to get total number of collections that satisfy geo location query. Mongo go library provides Document Count method with doesn't support filter based on geo location.

The error I am getting is: (BadValue) $geoNear, $near, and $nearSphere are not allowed in this context

filter := bson.D{
    {
        Key: "address.location",
        Value: bson.D{
            {
                Key: "$nearSphere",
                Value: bson.D{
                    {
                        Key: "$geometry",
                        Value: bson.D{
                            {
                                Key:   "type",
                                Value: "Point",
                            },
                            {
                                Key:   "coordinates",
                                Value: bson.A{query.Longitude, query.Latitude},
                            },
                        },
                    },
                    {
                        Key:   "$maxDistance",
                        Value: maxDistance,
                    },
                },
            },
        },
    },
}
collection := db.Database("catalog").Collection("restaurant")
totalCount, findError := collection.CountDocuments(ctx, filter)
  • 写回答

1条回答 默认 最新

  • ds15812330851 2019-09-12 00:07
    关注

    (BadValue) $geoNear, $near, and $nearSphere are not allowed in this context

    You're getting this message due to the restricted use of db.collection.countDocuments().

    The method countDocuments() essentially wraps aggregation pipeline $match and $group. See The Mechanics of countDocuments() for more information. There are a number of query operators that are restricted : Query Restrictions, one of them being $nearSphere operator.

    An alternative is to use [$geoWithin] and $centerSphere:

    filter := bson.D{ 
      { Key: "address.location", 
        Value: bson.D{ 
            { Key: "$geoWithin", 
                Value: bson.D{ 
                    { Key: "$centerSphere", 
                      Value: bson.A{ 
                                bson.A{ query.Longitude, query.Latitude } , 
                                maxDistance}, 
                    }, 
                },
            },
        },
      }}
    

    Note that the maxDistance in spherical geometry has to be in a radius. You need to convert the distance, for example 10/6378.1 for 10 kilometres please see Calculate Distance using Spherical Geometry for more information.

    Also worth mentioning that although $centerSphere works without having a geospatial index, geospatial indexes support much faster queries than the unindexed equivalents.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装