【发布时间】: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