【问题标题】:Several issues with $geoNear pipeline$geoNear 管道的几个问题
【发布时间】:2022-11-29 17:41:48
【问题描述】:

我遇到了 $geoNear 的问题,无论我做什么,它都会抛出错误。没有意义的错误。

const location = [Number(response.data.results[0].location.lat), Number(response.data.results[0].location.lng)];
const distance = parseFloat(req.query.distance);

console.log(location); // [ 37.620321, -92.139884 ]
console.log(distance); // 40233.5

return Vendor.aggregate([
    {$geoNear: {
        near: {
            type: "Point",
            coordinates: location
        },
        distanceField: "distance",
        maxDistance: distance
    }},
    {$match: {"publicData.searchable": true}},
    {$project: {
        name: 1,
        description: 1,
        items: 1,
        address: 1,
        email: 1,
        distance: 1,
        publicData: 1,
        url: 1
    }}
]);

这将给出错误:

MongoServerError: geo near accepts just one argument when querying for a GeoJSON point. Extra field found: $maxDistance: 40233.5
    at Connection.onMessage (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/connection.js:207:30)
    at MessageStream.<anonymous> (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/connection.js:60:60)
    at MessageStream.emit (node:events:513:28)
    at processIncomingData (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/message_stream.js:132:20)
    at MessageStream._write (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/message_stream.js:33:9)
    at writeOrBuffer (node:internal/streams/writable:391:12)
    at _write (node:internal/streams/writable:332:10)
    at MessageStream.Writable.write (node:internal/streams/writable:336:10)
    at Socket.ondata (node:internal/streams/readable:754:22)
    at Socket.emit (node:events:513:28) {
  ok: 0,
  code: 2,
  codeName: 'BadValue',
  [Symbol(errorLabels)]: Set(0) {}
}

我发现一些信息表明当“near”的数据不好时会抛出这个错误。但是,我已经检查过并且我的数据格式正确。

然后我尝试简单地删除“maxDistance”字段以查看发生的情况,我得到了这个:

MongoServerError: invalid argument in geo near query: type
    at Connection.onMessage (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/connection.js:207:30)
    at MessageStream.<anonymous> (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/connection.js:60:60)
    at MessageStream.emit (node:events:513:28)
    at processIncomingData (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/message_stream.js:132:20)
    at MessageStream._write (/home/leemorgan/projects/javascript/market/market-api/node_modules/mongodb/lib/cmap/message_stream.js:33:9)
    at writeOrBuffer (node:internal/streams/writable:391:12)
    at _write (node:internal/streams/writable:332:10)
    at MessageStream.Writable.write (node:internal/streams/writable:336:10)
    at Socket.ondata (node:internal/streams/readable:754:22)
    at Socket.emit (node:events:513:28) {
  ok: 0,
  code: 2,
  codeName: 'BadValue',
  [Symbol(errorLabels)]: Set(0) {}
}

这对我来说也没有意义。谁能告诉我造成所有这些问题的原因是什么?

【问题讨论】:

标签: javascript node.js mongodb mongoose


【解决方案1】:

数据库中的位置应采用位置格式:[ lon, lat ] 这是主要问题。因为 mongodb 不验证这种格式的位置数组。

验证数据库中的数据和查询时指定的点都应该是正确的格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    相关资源
    最近更新 更多