【问题标题】:Checking for existence of a field in firebase real-time database检查firebase实时数据库中是否存在字段
【发布时间】:2021-11-14 09:42:01
【问题描述】:

对于firebase函数,我们有时可能需要检查实时数据库中的某个字段是否存在,例如,我们可能正在循环访问实时数据库中的所有用户记录,并且可能只有部分用户有一个字段,比如“汽车”。据我从the selected answer in the SO post 了解到,我们可以调用exists() 或检查null。

第一个是检查car 是否存在:

if(dataSnapshot.child("car").exists()) {
    //Do something
}

第二个是检查car 字段是否为空:

if(dataSnapshot.child("car").val() != null) {
    //Do the other thing
}

问题是,这两种方式如何比较,首先,在结果方面? exists() === falsenull 相同,exists() === true!null 相同,还是有什么特殊情况需要考虑?其次,性能如何?与exists() 的函数调用相比,空值检查是否更快,是否使用更少的资源(内存等)?还是纯粹是偏好/口味问题?

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    看一下API源码就可以给出答案。

    让我们从 .exists() 方法开始。在this link(第 361 行),您可以看到 exists 方法执行了对底层 isEmpty() 方法的调用。

    在同一个文件的第 462 行,我们可以看到 val() 方法的实现:它调用内部节点的 val() 方法。好吧,让我们看一下:在this link,第 197 行,您可以看到 val() 方法要做的第一件事就是调用 isEmpty() 方法,如果是真的,它将返回一个空值。

    这告诉我们这两种方法(使用 exists() 或评估 val() 的返回值并检查它是否为空)给出了相同的结果。

    让我们进入性能方面:两种方式的性能相同。如果您要密集调用这些方法,exists() 将执行较少的内部调用,因此它应该是首选。

    【讨论】:

    • 谢谢!我不知道这些源代码文件的可用性。感谢您的检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多