【问题标题】:read only certain fields in firebase仅读取 firebase 中的某些字段
【发布时间】:2018-06-28 09:45:32
【问题描述】:

如果我有类似的数据库

users: {
  user1: { 
    name:'qwert', 
    id: 123,
    num: 9999 
  },
  user2: { 
    name:'zxcvb', 
    id: 456,
    num: 8888 
  }
}

我怎样才能只读取所有用户的名字?

我的预期结果:

{
  user1:{
    name:'qwert'
  }, 
  user2:{
    name:'zxcvb'
  }
}

如果我在 JavaScript 中使用它:

ref('users').once('value').then((snap)=>{console.log(snap.val())})

我得到所有用户的所有数据(但我只想要每个用户的名称)

我应该对查询进行哪些更改以获得预期结果?

任何建议都将受到高度赞赏并且非常有用。我尝试搜索文档,但没有得到我想要查找的内容。

我的最终目标是降低读取不必要数据的成本。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    无法仅从当前数据模型中选择名称,Firebase 始终检索完整节点。因此,您要么必须按照 Peter 的回答进行操作,读取所有数据但在客户端提取用户名,要么必须修改数据模型以允许用例。

    后者很简单。如果要加载用户名列表,则应在数据库中存储用户名列表:

    users: {
      user1: { 
        name:'qwert', 
        id: 123,
        num: 9999 
      },
      user2: { 
        name:'zxcvb', 
        id: 456,
        num: 8888 
      }
    },
    usernames: {
      user1: 'qwert', 
      user2: 'zxcvb'
    }
    

    使用这种结构,只读取名称是很简单的。

    另见:

    【讨论】:

    • 是的,你是对的,这更快,但是如果他只想读取“年龄”并且只读取“id”,然后只读取“num”。那么他必须在这种情况下单独做每一个:p
    • 这些用例都不像想要用户名列表那样常见。例如,没有用户标识的用户年龄列表似乎毫无用处。现在是数据库中所有年龄的列表,这样您就可以看到具有该年龄的用户,这听起来像是一个更合理的用例,并且需要再次使用不同类型的数据结构。所有这些的共同点是,它们在写入数据时会复制数据,以减少读取用例数据时的查询时间/加载带宽。
    【解决方案2】:

    要仅检索用户的姓名,请尝试以下操作:

    firebase.database().ref().child("users").on("value", function (snapshot) {
      snapshot.forEach(function(childSnapshot) {
       var name=childSnapshot.val().name;
      });
    });
    

    这里的快照是users,然后您在user1user2 内部进行迭代,以便能够访问这些用户的名称并检索它们。

    【讨论】:

    • 您可能想要强调此检索所有数据,但仅显示用户名。
    • 嗯,是的,它将检索users 下的所有内容并显示名称,因为这是答案中指定的名称。为什么还有其他方法?
    • 自从 OP 询问“我怎样才能只读取所有用户的姓名?”,我会更明确地说明这个阅读内容,而不仅仅是他们的姓名。有关替代方法,请参阅我的答案,该方法通过复制附加列表中的一些数据来减少需要读取的数据量。
    • 嗨,彼得!虽然这部分回答了我的问题,但我的最终目标是减少从数据库下载/上传到数据库的数据。当我使用 blaze 计划时,我想确保减少下载不必要数据的不必要费用。 @FrankvanPuffelen 方法是我一直在遵循的(希望这是最合适的)。它减少了多次读取的数据量,代价是只写入一次。
    • @IshanNaktode 是的,这很好,但是当你有这个数据库usernames: { user1: 'qwert', user2: 'zxcvb' } 时,你甚至知道如何检索名称吗?
    【解决方案3】:

    我想我迟到了,但经过一些广泛的研究,有一种方法可以从 Firestore 中获取特定字段。我们可以使用select 关键字,您的查询类似于(我正在使用集合作为通用方法):

    const result = await firebase.database().collection('users').select('name').get();
    

    我们可以在哪里访问result.docs 以进一步检索返回的过滤结果。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多