[英]Firebase Realtime Database - orderByChild().equalTo() does not return expected node
[英]In Firebase's realtime Database, does `equalTo(arg)` only work if arg is an object?
数据库1:
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)
不喜欢处理不 object 的 args。
为了开始我的解释,我想说equalTo(arg) 仅在arg 是obj 时才有效是不对的。 没有关于 arg 类型的规则。 在运行查询期间只会使用 arg 的类型,但这并不意味着 arg 应该是 object。 arg 可以是任何类型的值,如字符串、字符、日期、整数,但不确定它是否可以是数组。
让我给你一些关于上面equalTo
如何在你的代码中工作的提示。 首先,在firebase中,我们通过结合排序( order-by method
)和过滤(limit-range方法)对路径进行查询。 通常,我们以这种方式使用查询:
db.ref(路径)。 sorting function
。 filtering function
.on('value',snapshot=>{});
在您的代码中, orderByKey() 正在sorting function
,而equalTo('c')
正在filtering function
应用于排序结果。 equalTo() 将在 orderByKey() 完成后处理,返回排序数组。 重要的是, e.val()
equalTo('c')
也返回 JSON object ,其中包含超过 1 个匹配的 obj,而不是单个结果,因为将有超过 1 个结果与“c”匹配。 这就是在 db1 上运行 equalTo 后可以看到结果{c:"d"}
的原因。
假设您有两个具有相同密钥的 obj: c
under b
a: {
b: {
c: "d",
c: "e",
}
}
如果没有orderByKey
,equalTo('c') 将遍历b
下的所有对象。 然后运行 equalTo('c'): e.val()
的结果将是{c:"d",c:"e"}
但是如果你在 equalTo('c') 之前运行orderByKey
然后 equalTo('c')在排序数组上运行: {c: "d"}
但结果仍然是 object 数组而不是单个值: {c: "d"}
。
所以 point is equalTo('key')
返回 object 数组这种样式: {key:"value1",key:"value2",...}
如果没有结果则返回 null。 根据我的经验,如果我想获得运行查询equalTo()
的值,我在 equalTo 之前使用equalTo
() 并返回结果的第一个元素。 所以这对你有用。
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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.