当前位置: 首页 > 知识库问答 >
问题:

基于MongoDB ODM的地理空间查询

纪正德
2023-03-14
db.adverts.find({coordinates:{$near:[20,40]}})
{ "_id" : ObjectId("4fddac51352de93903000000"), "title" : "dummy #3", "coordinates" : { "longitude" : 22, "latitude" : 31 } }
{ "_id" : ObjectId("4fddac48352de95105000000"), "title" : "dummy #3", "coordinates" : { "longitude" : 20, "latitude" : 30 } }
{ "_id" : ObjectId("4fddaca4352de93703000000"), "title" : "dummy #3", "coordinates" : { "longitude" : 31, "latitude" : 22 } }
{ "_id" : ObjectId("4fdda6a2352de90a03000000"), "title" : "dummy title", "created" : ISODate("2012-06-17T09:42:58Z"), "coordinates" : { "longitude" : 54.1234, "latitude" : -1.234 } }
{ "_id" : ObjectId("4fdda6d8352de9c004000000"), "title" : "dummy title #2", "created" : ISODate("2012-06-17T09:43:52Z"), "coordinates" : { "longitude" : 54.34, "latitude" : -1.124 } }
$adverts = $dm->createQueryBuilder('Advert')
                      ->field('coordinates')->near(20, 40)
                      ->getQuery()
                      ->execute();
$adverts->count(); // => 0
Advert:
    type: document
    collection: adverts
    fields:
        id:
            id: true
        title:
            type: string
        content:
            type: string
        created:
            type: date
        updated:
            type: date
        status:
            type: int
        distance:
            type: int

    indexes:
        coordinates:
            keys:
                coordinates: 2d

    referenceOne:
        owner:
            targetDocument: User

    embedOne:
        coordinates:
            targetDocument: Coordinates
Coordinates:
    type: embeddedDocument
    fields:
        longitude:
            type: float
        latitude:
            type: float

有没有想过为什么使用Dociety的ODM会在同一个查询上返回零结果?

更新#1看起来教义\MongoDB\Query\Builder::near()L363有问题。方法参数忽略第二个值($Y)。因此只传递要执行的第一个值。

共有1个答案

程胡非
2023-03-14

near()方法似乎存在一个实现问题(请参见https://github.com/stoculine/mongodb/pull/53)。要修复我的原始查询,我需要执行以下操作;

$adverts = $dm->createQueryBuilder('Advert')
              ->field('coordinates.latitude')->near(20)
              ->field('coordinates.longitude')->near(40);

$adverts->getQuery()->count(); // => 5

这与当前的文档相矛盾,该文档暗示x、y坐标都可以传递给Doctine\MongoDB\Query\Builder::near()。

编辑

public function near($longitude, $latitude)
{
    $query = $this->createQueryBuilder()
                  ->field('coordinates.longitude')->near((float) $longitude)
                  ->field('coordinates.latitude')->near((float) $latitude)
                  ->getQuery();

    return $query;
}
 类似资料:
  • 我有一个包含许多文档集合,其结构如下: 纬度范围为[25;55] 该收藏包含大约60万条记录。 我设置了2D_Sphere索引:db.myCollection.createIndex({location:“2DSphere”}) 我获得了所有的记录,但我只期望有几个记录(靠近我的坐标!) 有什么建议吗?提前致谢

  • 以上描述的作为基于装饰器的活动处理函数的替代,属于命名空间的活动处理函数可以被创造成一个类的方法。Flask_socketio.Namespace提供了一个基于类的方法来创造命名空间。 from flask_socketio import Namespace, emit class MyCustomNamespace(Namespace): def on_conect(): pas

  • 问题内容: 我们正在寻找一种快速准确的方法来根据访问者的IP获取访问者的位置。 我们已经尝试过ipinfodb.com,但在调用API时,其API使我们的网站严重滞后。 您还建议其他哪些服务? 问题答案: 获取Geo-IP信息 请求地理IP服务器(netip.de)进行检查,并返回IP所在的位置(主机,州,国家/地区,城镇)。

  • 我试图使用卡桑德拉文档中的地理空间示例:https://docs.datastax.com/en/dse/6.7/cql/cql/cql_using/search_index/queriesGeoSpatial.html 我收到错误: 我正在使用堆栈:[cqlsh 5.0.1|Cassandra 3.11.1|CQL规范3.4.4|本机协议v4] 如何解决?

  • 我在PostGis中很新,我正在使用它来执行地理空间查询,但它在返回所需结果时似乎很慢。 在此之前,我使用了一个python脚本,该脚本通常在大约5秒钟内返回结果(搜索120万个元素)。 为了更快地得到这个结果,我将问题转移到postgis上,但是,正如我之前所写的,同样的工作需要20秒以上的时间。 更准确地说,每个元素由一个点(lat lon)和一个字符串(点的标签)组成 我正在使用一个停靠的p

  • 在DynamoDB中,我有一个表,其中每条记录都有两个日期属性,