【问题标题】:Firebase - snapshot based on idsFirebase - 基于 id 的快照
【发布时间】:2017-06-08 07:59:20
【问题描述】:

我一直在到处寻找构建特定请求的逻辑,但我并没有完全理解 firebase 的理念。这是我的数据结构:

`users:{
  u1_id:{...}
  u2_id:{...}
  ...
},
 contacts:{
  u1_id:{
   contact1_id,
   contact2_id,
   ...
  }
}`

我的第一个选项是获取有关用户 ID 的数据的请求,第二个(实际的)是在添加联系人时存储我需要的数据,但我需要运行一个大更新每个用户的每个联系人,这似乎不是正确的解决方案。 (我检查了问题、firebase 文档和视频)

我找到的最接近的解决方案是这个(来自他们的 youtube):

 function getUserContacts(key, cb){
  const rootRef = firebase.database().ref()
  const contactsRef = rootRef.child('contacts')
  const usersRef = rootRef.child('users')

  contactsRef.child(key).on('child_added', snap => {
    let userRef = usersRef.child(snap.key)
    userRef.once('value', cb)
  })

}

但它给用户 1 比 1,而不是我所有用户的对象

编辑:我的临时解决方案 ->

firebase.database().ref('users')
    .on('value', snaps => {
      firebase.database().ref(`contacts/${currentUser.uid}`)
      .on('value', snapshot => {
        let userContacts = []
        snapshot.forEach(snapc => {
          snaps.forEach(snapu => {
            let duser = snapu
            if(snapc.key == snapu.key)
            {
              userContacts.push(snapu.val())
            }
          })
        })
        dispatch({
          type: CONTACTS_FETCH, 
          payload: userContacts
        })
      })
    })

【问题讨论】:

  • 这是一个相当模糊的问题,至少对我来说,不清楚你在问什么。您首先要获取有关用户 ID 的数据。这意味着什么?你想从 users/user_id_x 节点获取数据吗?第二项说重大更新。那是什么,你要更新什么?
  • 感谢您的回答。联系人树仅存储已添加到用户联系人列表中的用户的 ID。我想要的是获取这些用户的详细信息,以便在联系人列表中显示他们。更新问题是在我存储数据而不是每个联系人的 id 的情况下,例如,如果用户更改是昵称,我将不得不更新每个拥有此联系人的用户的所有出现,我希望它变得清晰。
  • 目前还不清楚。是否要使用联系信息填充列表。换句话说,读取联系人 ID,遍历列表并加载每个联系人?
  • 没错,但我坚持使用 firebase 功能。我可以获取联系人 ID,但我不知道如何在同一函数中获取每个人的详细信息。
  • 正如我在上面的评论中提到的;读取我的 id 的......也许进入一个数组,然后立即遍历数组并加载个人联系信息。使用 .value 一次读取联系人 ID 列表。您还可以将用户 ID 添加为属于他们的每个联系人的孩子,并对这些联系人进行查询。

标签: firebase react-native firebase-realtime-database


【解决方案1】:

这个问题还有点不清楚,但让我提出三个选项:

如果我们想用 user_1 的联系人填充列表,我们会按值读取用户联系人节点。在这种情况下,user_1 有两个联系人; user_id2 和 user_id3

contacts
   user_1
     user_id2: true
     user_id3: true

在父节点 (user_1) 中读取值以及所有子数据。因为我们拥有整个数据节点(快照),我们可以遍历 user_1 的子值以获得每个 user_idx(这是每个子节点的键)。当您遍历子节点时,每个子节点都会显示一个键,然后您可以在该特定用户节点中读取该键。

第二种选择是改变结构。

contacts
   user_2
     name: "John"
     rank: "Captain"
     contact_of: "user_1"
   user_3
     name: "William"
     rank: "Second Officer"
     contact_of: "user_1"

使用这种结构,如果用户 1 想要加载他们的联系人,则在联系人节点上进行简单查询,其中 contact_of = "user_1"。这将加载每个联系人及其所有数据。

第二个示例适用于用户具有未共享的特定联系人的情况。

如果多个用户可以有多个联系人,这是另一种选择。

contacts
   user_2
     name: "Jean Luc"
     rank: "Captain"
     contact_of
        user_1: true
        user_2: true
   user_3
     name: "William"
     rank: "Second Officer"
     contact_of:
        user_1: true
        user_2: true

在这种情况下,在contact_of/user_1 = true的联系人节点上执行deep query,这将显示user_2和user_3/

【讨论】:

  • 这就像第三个选项:他们是多个用户,他们可以有多个联系人,一个联系人可以是任何其他用户。我已经阅读了深度查询,但对我来说并不是很清楚。我的问题是获取有关用户联系人列表的最新信息,现在就是这种情况。
  • @Sai 标准查询允许查询更深一层。在第三个示例中,可以在 user_x/name 或 user_x/rank 节点上进行查询。深度查询允许更深一层的查询,因此可以在 user_x/contact_of 上进行查询。所以像 user_x/contact_of/user_1: true 这样的查询是可能的。深度查询功能强大,可以访问通常必须非规范化才能访问的数据。您可以将观察者附加到联系人节点,如果有任何联系人更新,您的应用程序将收到最新信息通知。如果我的回答有帮助,请采纳,以便对他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多