首页 > 解决方案 > firebase indexOn 用于子值

问题描述

我正在尝试使用如下所示的 firebase Query 获得所有心情等于 M1 的帖子:

db.ref(`Recommendations`).orderByChild(`post/vote/moodTags/${idMood}/key`).equalTo(`${idMood}`).once('value').then(recs =>{
        //Número de recs con el mood
        let recsCount = recs.numChildren();
        console.log(`Número de recs encontradas --> ${recsCount}`);
        ...
    });

和 firebase 控制台显示警告:

FIREBASE 警告:使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /Recommendations 中的 ".indexOn": "post/vote/moodTags/M1/key" 添加到您的安全规则中以获得更好的性能。

但是,我在 firebase 站点的索引规则是:

"Recommendations":{
  ".indexOn": ["post/userFirebaseKey","post/user/firebaseKey","userFrom/firebaseKey","post/location/placeId","firebaseKey","placeId"],
  "post":{
    "vote":{
      "moodTags":{
        "$moodId":{
          ".indexOn": "key"
        }
      }
    }
  }
}

那么,当我使用子级别时,如何实际指定 indexOn 规则?

我的数据库:

+ Recommendations
  + idRec
    property1:''
    property2:''
    property3:''
    + post
      property21:''
      ...
      + vote
        + moodTags
          + M1
            key:'M1'
            name:''
            url:''
          + M2        
            ...

标签: javascriptnode.jsfirebasefirebase-realtime-database

解决方案


您似乎在那里操作的级别太深了:毕竟您想要索引moodTags 列表,而不是一个moodTag 的内容。

这意味着您的规则必须看起来更像这样:

"Recommendations":{
   ".indexOn": ["post/userFirebaseKey","post/user/firebaseKey","userFrom/firebaseKey","post/location/placeId","firebaseKey","placeId"],
  "post":{
    "vote":{
      "moodTags":{
          ".indexOn": "key"
        }
      }
    }
  }
}

您可以在Google Firebase 官方文档Medium 上这篇有用的文章以及有人遇到类似问题的 Google Groups 帖子中阅读这些索引规则。


推荐阅读