gpt4 book ai didi

node.js - 在嵌套的 firebase 实时数据库结构中添加索引的正确方法

转载 作者:行者123 更新时间:2023-12-05 03:04:01 25 4
gpt4 key购买 nike

by数据库的结构如下:

my-db
|
Users
|
CreatedAt: "SOME_VALUE"
|
Email: "SOME_EMAIL"
|
Mailboxes
|
445566
|
Address: "My address 1"
|
Status: Active
|
112233
|
Address: "My address 2"
|
Status: Active

我想做的是只过滤拥有特定 ID 事件邮箱的用户。我正在使用 firebase cloud functions为此,我的做法如下:

db.ref('/Users')
.orderByChild('mailboxes/' + mailboxId + '/status')
.equalTo('Active')
.once("value", function(snapshot){
snapshot.forEach(function(childSnapshot){
// GET SPECIFIC USER DATA FROM childSnapshot
})
})

到目前为止它似乎工作正常,但我在 firebase 函数日志中收到警告错误:

@firebase/database: FIREBASE WARNING: Using an unspecified index. Your data will be downloaded and filtered on the client. Consider adding ".indexOn": "mailboxes/445566/status" at /Users to your security rules for better performance.

我尝试在规则文件中添加索引:

{
"rules": {
".read": true,
".write": true,
"users": {
"$userid": {
"mailboxes": {
"$mailboxid": {
".indexOn": ["status"]
}
}
}
}
}
}

但还是没有成功。我现在想知道这里有什么不正确的地方。

最佳答案

需要在运行查询的位置定义索引。因此,由于您在 /Users 上运行查询,因此需要在此处定义索引。正如错误消息所说:

{
"rules": {
".read": true,
".write": true,
"users": {
".indexOn": "mailboxes/445566/status"
}
}
}

但是您会立即注意到,这意味着您需要为每个 UID 建立一个索引,这是不可行的。这是因为Firebase数据库只能查询平面列表,不能跨多级查询。

您当前的数据结构允许您有效地读取给定用户的所有邮箱。但是,它并不容易让您找到特定邮箱状态的所有用户。为了允许后者,您需要一个额外的数据结构,您可以在其中存储邮箱列表(您正在查询的实体)、它们的状态(您正在过滤的条件)和它们的用户(您想要的结果) .

mailboxes: {
"445566": {
"Status": "Active",
"user": "uid1"
},
"112233" {
"Status": "Active",
"user": "uid2"
}
}

有了上面的附加结构,就可以使用这个索引了:

"mailboxes": {
".indexOn": "Status"
}

接下来您查询此/mailboxes 以获取具有特定状态的所有邮箱,然后确定其中要显示的唯一用户。

另见:

关于node.js - 在嵌套的 firebase 实时数据库结构中添加索引的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53295841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com