uni-app中支付宝云数据库加了地理索引后dbCmd.geoNear报invalid $match

发布于 1周前 作者 bupafengyu 来自 Uni-App

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中的条件是否正确地引用了集合中的字段,并且没有尝试对地理位置字段进行不合适的操作。

回到顶部