【问题标题】:Firebase Database: why do the key/ref in my queried datasnapshot refer to its parent?Firebase 数据库:为什么我查询的数据快照中的键/引用引用其父级?
【发布时间】:2017-11-14 05:22:56
【问题描述】:

我想从通过查询查找的实时数据库中删除一个条目,但我得到了 ref 和 key 属性的意外结果。

ref('photos/users/USERID')
    .orderByChild('photoname')
    .equalTo('photoname i want to look up')
    .limitToFirst(1)
    .query('once')
    .then(snapshot => {
        // correct data at 'photos/users/USERID/PHOTOID'
        const entry = snapshot.val(); 

        // seems to be the ref to photos/users/USERID'
        const ref = snapshot.ref; 

        // seems to be USERID
        const key = snapshot.key
    })

为什么这些不是我刚刚找到的条目的参考/键?删除此条目的最佳方法是什么?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

    您的代码需要考虑此列表,并遍历 snapshot.forEach() 以获取实际匹配项:

    ref('photos/users/USERID')
        .orderByChild('photoname')
        .equalTo('photoname i want to look up')
        .limitToFirst(1)
        .query('once')
        .then(snapshot => {
          snapshot.forEach(child => {
            const entry = child.val();     
            const ref = child.ref;     
            const key = child.key
          });
        })
    

    【讨论】:

    • 有没有办法通过某种索引来访问这些孩子?因此,如果我执行 limit-by-1 查询,我可以在无需迭代的情况下获取第一个(也是唯一一个)结果吗?
    • 一个项目的列表仍然是一个列表,所以你需要迭代。如果你想防止这种情况,你可以做once('child_added'。但这比我建议的要牺牲代码清晰度(以及可维护性)。
    • 我目前正在这样做pastebin.com/5nhaauTa,这有点难看,所以我想知道是否有类似getChildAt(0) 的东西(尽管我应该能够使用array.reduce 改进该代码)
    【解决方案2】:

    您的 ref 和密钥基于 ref('photos/users/USERID'),而不是您创建的过滤子集。你有什么理由不打电话给 ref('photos/users/USERID/PHOTOID')?

    【讨论】:

    • 我还没有照片的 id,这就是我试图查询和(之后)通过 ref/key 属性访问的内容。但显然我必须先迭代结果。
    • Gotcha - 我不知道是否有替代方案,但我通过调用它、获取 id、调用它并删除它来解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2020-01-20
    • 1970-01-01
    • 2020-02-02
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多