在云函数中实现 geofire 的索引错误

Indexing error implementing geofire in cloud function

我在我的应用程序中对工作和用户进行地理定位。我正在我的 index.js 中创建 2 个全局索引,如下所示:

const geousers = new GeoFire(admin.database().ref().child('geolocation').child('users'));
const geojobs = new GeoFire(admin.database().ref().child('geolocation'.child('jobs')));

我在我的函数中做了一个地理查询:

exports.nearbyjobs = functions.database.ref("/users/{userid}/account/l").onWrite((event) => {
  const location = event.data;
  if (location.child("lat").val() === null || location.child("lng").val() === null) return false;
  const uid = event.params.userid;
  let lat = Number(location.child("lat").val());
  let lng = Number(location.child("lng").val());
  const geoQuery = geojobs.query({
    center: [lat, lng],
    radius: 0.7
  });
  return admin.database().ref(`users/${uid}/nearbyjobs`).remove().then(data => {
    geoQuery.on("key_entered", function(key, location, distance) {
      return Promise.all([admin.database().ref(`jobs/${key}/category`).once('value'), admin.database().ref(`users/${uid}/account/categories`).once('value')]).then(r => {
        const promises = [];
        const cP = r[0];
        const cO = r[1];
        if (cO.val().includes(cP.val())){
          return admin.database().ref(`users/${uid}/nearbyjobs/${key}`).set({
            jobkey: key,
            distance: distance,
            l: location
          });
        }
      });
    });
  });
});

在我的函数控制台中,我收到警告:

FIREBASE WARNING: Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "g" at /geojobs to your security rules for better performance.

地理定位的数据库结构:

geolocation
   |
   -users
     |
      +<key>
   |
   -jobs
     |
      +<key>

首先,你确定你的数据库的文件名是job吗?根据错误,我猜你已经创建了一个文档存储作为 geojobs。 无论如何,假设您的文档存储名称是 geojobs,这就是您解决上述错误的方法 您必须在 geojobs 下添加规则。转到 Firebase 控制台 --> 数据库 --> 规则。

你会看到类似下面的内容,

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

您必须通过添加 .indexOn 将其更改为以下内容。

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
      "geojobs": {
      ".indexOn": ["g"]
    }
  }
}