- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!