【问题标题】:Querying multiple collections in Firebase在 Firebase 中查询多个集合
【发布时间】:2017-08-04 22:35:58
【问题描述】:

我已经与 Firebase 合作了一段时间,并且喜欢他们关于保持数据非规范化的建议。我唯一的问题是找出跨多个集合查询的最佳方法。例如,我有一个 Identity 对象,其中包含有关我的用户的信息:

identities: {
  $identity: {
    name: string,
    studio: $studioID
}}

对应一个 Studio 对象:

studios: {
  $studio: {
    name: string,
    owner: $identityID,
    location: $locationID
}}

此对象引用所有者及其位置。位置对象引用了 Classes,Classes 不断地引用 Student....。现在,为了获取引用的对象,我正在做这样的事情:

Auth.loginUser(email, password, (success) => {
    const identityRef = firebase.database().ref('/identity');
    identityRef.child(success.uid).on("value", function(identitySnapshot) {

      const identity = identitySnapshot.val();
      const studioRef = firebase.database().ref('/studios');

      dispatch({type: 'UPDATE_IDENTITY', identity})

      studioRef.child(identity.studioID).on("value", function(studioSnapshot) {

        const studio = studioSnapshot.val();

        dispatch({type: 'UPDATE_STUDIO', studio});
    })}); });

我会继续嵌套对 Location、Classes、Student 等的调用。有更好的方法吗?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database nosql


    【解决方案1】:

    考虑以下结构:

    identities: {
        $identityKey: {
            name: string
        }
    }
    
    identities_studios: {
        $identityKey: {
            $studioKey: {
                name: string
            }
        }
    }
    
    identities_studios_locations: {
        $identityKey: {
            $studioKey: {
                $locationKey: {
                    lat: string,
                    lng: string
                }
            }
        }
    }
    

    第一个 identities 像往常一样只存储有关身份的信息。

    第二个identities_studios 只存储有关工作室的信息,但工作室按$identityKey 分组。

    第三个 identities_studios_locations 仅存储有关位置的信息,但它们首先按 $studioKey 分组,其次按 $identityKey 分组。

    现在你可以这样做了:

    const db = firebase.database()
    
    Auth.loginUser(email, password, success => {
        db.ref(`/identities/${success.uid}`).on("value", snap => { ... }
    
        db.ref(`/identities_studios/${success.uid}`).on("value", snap => { ... }
    
        db.ref(`/identities_studios_locations/${success.uid}`).on("value", snap => { ... }
    }
    

    我们不是一个接一个地发出多个请求,而是让它们同时运行。

    如果您愿意,在从数据库中获取所有这些信息后,您可以将数据结构转换为您想要的任何内容:一个用于身份的数组,另一个用于工作室,另一个用于位置等;或具有嵌套工作室的单个身份数组,这些工作室又具有嵌套位置等。

    【讨论】:

    • 感谢您抽出宝贵时间回复!我唯一的问题是我的数据仍然被捆绑在一起,即使它位于不同的“集合”中。由于一切都绑定到特定的 uid,我将如何与多个用户共享相同的数据?我将事物分成不同集合的原因是为了使其可供多个实体使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2014-08-09
    • 2019-05-09
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多