【问题标题】:Mongodb find query with $near and coordinates not workingMongodb find 查询与 $near 和坐标不起作用
【发布时间】:2014-04-05 13:17:24
【问题描述】:

我正在尝试使用 mongodb 中的一些地理定位功能。使用带有 $near 的查找查询似乎不起作用!

我的数据库中目前有这个对象:

{
    "Username": "Deano",
    "_id": {
        "$oid": "533f0b722ad3a8d39b6213c3"
    },
    "location": {
        "type": "Point",
        "coordinates": [
            51.50998,
            -0.1337
        ]
    }
}

我也设置了以下索引:

{
  "v": 1,
  "key": {
    "location": "2dsphere"
  },
  "ns": "heroku_app23672911.catchmerequests",
  "name": "location_2dsphere",
  "background": true
}

当我运行这个查询时:

db.collectionname.find({ "location" : { $near : [50.0 , -0.1330] , $maxDistance : 10000 }})

我收到此错误:

error: {
    "$err" : "can't parse query (2dsphere): { $near: [ 50.0, -0.133 ], $maxDistance: 10000.0 }",
    "code" : 16535
}

有人知道我哪里出错了吗?任何帮助将不胜感激!

【问题讨论】:

    标签: mongodb coordinates geojson 2dsphere


    【解决方案1】:

    如果您的数据也是 GeoJSON 格式,您似乎需要使用 GeoJSON 格式,就像您的一样。如果你使用:

    db.collectionname.find({
        "location": {
            $near: {
                $geometry:
                    { type: "Point", coordinates: [50.0, -0.1330] }, $maxDistance: 500
            }
        }
    })
    

    它应该工作。我可以使用该字段的 GeoJSON 存储格式复制您的错误,但是文档在查询表达式中称为遗留点。我认为文档有点不清楚,因为他们建议您可以同时使用 GeoJSON 和带有 2dsphere 索引的旧坐标2dsphere

    我正在使用 2.4.10,因为它值得,因为在 2.4 版本中对空间进行了一些重大更改。

    【讨论】:

    • 嘿,我实际上是在尝试搜索第一个最近的位置,而不考虑 maxDistance。它有效,但需要 4 秒,它真的很慢。有没有办法提高性能?
    • @约翰。我不知道您提供的信息,但是省略 maxDistance 意味着搜索整个数据库,这取决于大小,可能需要很长时间。
    • $nearSphere 从最近到最远返回?然后我使用limit()。我在数据库中的位置如下所示:[-5.95001220703125,46.149993896484375] 所以当我发送[-5, -46] 这将需要 2 - 3 秒。但是如果我发送这个位置,例如[-5.953801, 46.001843],这真的很快。我在22ms 中得到了结果。所以正常吗?
    【解决方案2】:

    这并不完全是一个解决方案,因为我从来没有完成上述工作,但使用 geoNear 我设法得到了我想要的。

    db.runCommand( { geoNear : 'catchmerequests', near: 
    { type: 'Point', coordinates : [50, 50] }, spherical : true } );
    

    如果有人能找出最初的 $near 尝试失败的原因,那将不胜感激,但我会将其发布给其他正在寻找可行替代方案的人。

    【讨论】:

    • 我已经发布了我认为的解决方案。一段时间以来一直想玩 mongo spatial——我是 Postgis 人——我很享受。谢谢。
    • @Dealss 我注意到上面的答案被标记为解决方案,但我在这里看到它对您不起作用,您正在使用 geoNear 解决方案。我在 MongoDB 文档中看到了以下参考资料,想知道您是否和我做了同样的事情并“插入”了您的文档。 对于插入,MongoDB 插入文档但不添加到 2dsphere 索引中。 您还获得了使用 $near 的原始解决方案吗? docs.mongodb.org/manual/core/2dsphere
    猜你喜欢
    • 2014-03-06
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多