uni-app中支付宝云数据库加了地理索引后dbCmd.geoNear报invalid $match
uni-app中支付宝云数据库加了地理索引后dbCmd.geoNear报invalid $match
代码示例
let { data: list } = await this.db.collection('sys_merch').where({
pos_obj: dbCmd.geoNear({
geometry: point
}),
is_open: true
})
.limit(1)
.get();
错误堆栈
stack: "FaasError: invalid $match
at new r (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/error.js:1:732)
at Function.r.SERVER_ERR (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/error.js:1:1291)
at Function.o.handleResponse (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/utils.js:1:1288)
at s.<anonymous> (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/Database/Query.js:1:4805)
at l (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/Database/Query.js:1:2040)
at Object.next (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/Database/Query.js:1:1310)
at u (/var/task/code/node_modules/@alipay/faas-common-sdk/lib/Database/Query.js:1:767)
at processTicksAndRejections (node:internal/process/task_queues:96:5)"
2 回复
已知问题,等待支付宝云修复
在uni-app中使用支付宝云数据库时,dbCmd.geoNear
命令是用于执行地理空间搜索的,它允许你根据地理位置查找附近的点。如果你在使用geoNear
时遇到了“invalid $match”错误,这通常意味着在$match
阶段中的查询条件可能不正确或者与地理索引不兼容。
以下是一个基本的geoNear
操作示例,以及如何正确设置地理索引和查询条件的代码案例。
1. 设置地理索引
首先,确保你的集合中已经为地理位置字段设置了2dsphere索引。在支付宝云数据库中,你可以通过控制台或者API来设置索引。以下是一个在MongoDB中设置2dsphere索引的示例(虽然是在MongoDB中,但云数据库操作类似):
db.yourCollection.createIndex(
{ location: "2dsphere" }
)
其中location
是你的地理位置字段名,通常包含经纬度信息,如{ type: "Point", coordinates: [longitude, latitude] }
。
2. 使用geoNear
查询
在uni-app中,你可能需要通过云函数来执行geoNear
查询。以下是一个简化的示例,展示如何在云函数中执行geoNear
查询:
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async (event, context) => {
const { longitude, latitude, distance } = event;
const res = await db.command({
geoNear: 'yourCollection',
near: { type: 'Point', coordinates: [longitude, latitude] },
spherical: true,
distanceField: 'distance',
maxDistance: distance, // 以米为单位
$match: { // 这里的条件需要确保与地理索引兼容
status: 'active' // 示例字段,根据实际情况调整
}
});
return res.results;
};
注意事项
- 确保
$match
中的条件不会与地理索引冲突。例如,如果索引是基于location
字段,而$match
试图过滤非地理位置字段,这通常不会引起问题,但任何尝试直接过滤地理位置字段(除非是通过地理运算符)都可能导致错误。 spherical: true
表示使用球面计算距离,这对于地球表面的地理计算是必要的。maxDistance
用于限制搜索范围,提高查询效率。
如果你仍然遇到“invalid $match”错误,请检查$match
中的条件是否正确地引用了集合中的字段,并且没有尝试对地理位置字段进行不合适的操作。