繁体   English   中英

在 Firebase 的实时数据库中,“equalTo(arg)”是否仅在 arg 为 object 时才有效?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM