【发布时间】:2021-01-14 15:13:19
【问题描述】:
我已经做了一个删除过期警报消息的云功能,我的数据结构如下:
Alerts
|-{country1}
|-{c1_state1}
|-{key}
|-msg: "bla bla"
|-end: 1601251200000
|-{c1_state2}
|-{key}
|-msg: "bla bla"
|-end: 1601251200000
|-{country2}
|-{c2_state1}
|-{key}
|-msg: "bla bla"
|-end: 1601251200000
|-{c2_state2}
|-{key}
|-msg: "bla bla"
|-end: 1601251200000
查看日志消息,我注意到 for 循环中的每个查询都有很多警告(states 变量)。
[2020-09-29T02:04:28.585Z] @firebase/database: FIREBASE 警告:使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /Alerts/BR/RR 处的 ".indexOn": "end" 添加到您的安全规则中以获得更好的性能。
我已经搜索了很多关于在 firebase 数据库中设置规则的信息,但我无法让这些规则发挥作用。在我的数据库中,我在国家和州中循环,这就是我使用通配符的原因($coutry 和 $state)
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": "auth != null",
".write": "auth != null",
"Alerts": {
"$country": {
"Sstate": {
".indexOn": ["end"]
}
}
}
}
}
我的功能正常工作,数据按预期删除,但警告不断出现。
exports.closeAnnouncementsBRTZ3 = functions.pubsub
.schedule('10 0 * * *')
.timeZone('America/Sao_Paulo') // Users can choose timezone - default is America/Los_Angeles
.onRun((context) => {
const expireTime = 1601251200000;
const ref = admin.database().ref().child('Alerts').child('BR');
const states = ['AC', 'AM', 'MS', 'MT', 'RO', 'RR'];
return Promise.all(states.map(async (state) => {
return await ref.child(state).orderByChild('end').endAt(expireTime).once('value', (dataSnapshot) => {
console.log('await dataSnapshot: ', state);
if (dataSnapshot.val() !== null) {
dataSnapshot.forEach(childSnapshot => {
console.log('child to be removed: ', childSnapshot.key);
childSnapshot.ref.remove();
});
}
});
}));
});
那么,如何正确设置规则以提高查询性能且不会出现警告?
【问题讨论】:
标签: javascript firebase-realtime-database google-cloud-functions firebase-security