在Firebase中查询多个集合

时间:2017-02-21 17:19:14

标签: javascript firebase firebase-realtime-database nosql

我已经使用Firebase一段时间了,就像他们建议保持数据非规范化一样。我唯一的问题是找出跨多个集合查询的最佳方法。例如,我有一个Identity对象,用于保存用户的信息:

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

这对应于Studio对象:

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

此对象引用所有者及其位置。 location对象引用Classes,它引用Students .... on和on。现在,为了获取引用的对象,我正在做这样的事情:

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});
    })}); });

我会继续为位置,课程,学生等打电话。是否有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

考虑以下结构:

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 => { ... }
}

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

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