gpt4 book ai didi

javascript - 在 Firebase 的实时数据库中, `equalTo(arg)` 是否仅在 arg 是对象时才有效?

转载 作者:行者123 更新时间:2023-12-05 06:56:49 26 4
gpt4 key购买 nike

db1:

a: {
b: {
c: "d"
}
}

db2:

a: {
b: "c"
}

db.ref(`a/b`).orderByKey().equalTo('c').on('value', (e) => {
console.log(e.val());
})

当引用 db1 时,e.val() 返回 {c: "d"}

当引用 db2 时,e.val() 返回 null。这是为什么?


一些更多的实验:

db.ref(`a/b`).orderByKey().on('value', (e) => { 
console.log(e.val());
})

当引用 db1 和 db2 时,分别返回 {b: "c"}"c"


据此,我只能猜测,出于某种原因,equalTo(arg) 不喜欢处理不反对的参数。

最佳答案

开始我的解释,我会说 equalTo(arg) 只有在 arg 是一个对象时才有效是不对的。没有关于 arg 类型的规则。在运行查询期间只会使用 arg 的类型,但这并不意味着 arg 应该是一个对象。 arg 可以是任何类型的值,例如字符串、字符、日期、整数,但不确定它是否可以是数组。

关于上述 equalTo 如何在您的代码中工作,让我给您一些提示。首先,在 firebase 中,我们通过结合对路径的排序(排序方法)和过滤(限制范围方法)来实现查询。在正常情况下,我们以这种方式使用查询:

db.ref(path).排序函数.过滤函数.on('value',snapshot=>{});

在您的代码中,orderByKey() 是排序函数equalTo('c') 是应用于排序结果的过滤函数。equalTo() 将在 orderByKey() 完成后处理,返回排序数组。重要的是 equalTo('c')e.val() 也返回 JSON 对象,它由超过 1 个匹配的对象组成,而不是单个结果,因为有将超过 1 个与“c”匹配的结果。这就是为什么在 db1 上运行 equalTo 后可以看到结果 {c:"d"} 的原因。

假设您有两个具有相同键的对象:c under b

a: {
b: {
c: "d",
c: "e",
}
}

如果没有 orderByKey,equalTo('c') 将遍历 b 下的所有对象。那么运行 equalTo('c'): e.val() 的结果将是 {c:"d",c:"e"} 但是如果你运行 orderByKey before equalTo('c') then equalTo('c') runs on sorted array : {c: "d"} 但结果仍然是一种对象数组而不是单一值:{c: "d"}.

所以要点是 equalTo('key') 返回这种样式的对象数组:{key:"value1",key:"value2",...} 如果没有结果则返回 null。根据我的经验,如果我想获取运行查询 equalTo() 的值,我会在 equalTo 之前使用 orderByKey() 并返回结果的第一个元素。所以这对你有用。

 db.ref(`a/b`).orderByKey().equalTo('c').on('value', (snapshot) => {
// important; snapshot.val() will be json object which contains more than 1 matched objs not a single key-value object.
const result = snapshot.val();
const value = Object.values(result)[0];
console.log("value",value);
})

// db2 also works the same. just it has deep 1 less than db1. but the same.

关于javascript - 在 Firebase 的实时数据库中, `equalTo(arg)` 是否仅在 arg 是对象时才有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65045562/

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