【问题标题】:Query in Firebase by value of childs [duplicate]按子项的值在 Firebase 中查询 [重复]
【发布时间】:2018-06-02 16:31:00
【问题描述】:
{
 "users" : {
  "1320104182" : {
   "datas" : {
    "bio" : "some_data",
    "picture" : "some_data",
    "username" : "some_data",
    "website" : "some_data",
    "followers" : 14,
   }
  },
  "3271376571" : {
   "datas" : {
    "bio" : "some_data",
    "picture" : "some_data",
    "username" : "some_data",
    "website" : "some_data",
    "followers" : 10,
   }
  }
 }
}

我是 Firebase 的新手,我正在尝试在这里进行多重思考,但到目前为止没有任何成功。

如何在不知道密钥的情况下通过他的“用户名”检索用户?

或者我如何按关注者排序用户?

我用了几个小时尝试了所有可以在文档中找到的东西,我很绝望。

【问题讨论】:

  • react-native 对吗?
  • 我在 react-native 中使用 Javascript SDK 是的

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


【解决方案1】:

这看起来很简单:

var ref = firebase.database().ref("users");
var query = ref.orderByChild("database/username").equalTo("some_data");
query.once("value", function(snapshot) {
  snapshot.forEach(function(child) {
    console.log(child.key, child.val().bio);
  });
});

【讨论】:

  • 非常感谢,太完美了
  • 太棒了!我完全忘记了equalTo 方法。这可能是正确的答案
【解决方案2】:

当您需要花哨的查询时,Firebase 并不是那么好。您必须在客户端 (JavaScript) 中处理所有内容,这不是处理大数据时的最佳方法。在这种情况下,我建议您这样做:

const nameToSearch = 'John';
firebase.ref('users').once('value') //get all content from your node ref, it will return a promise
.then(snapshot => { // then get the snapshot which contains an array of objects
  snapshot.val().filter(user => user.name === nameToSearch) // use ES6 filter method to return your array containing the values that match with the condition
})

要按关注者订购,您也可以应用 sort()(参见示例 1)或任何 firebase 默认方法 orderByChild()(参见示例 2)、orderByKey(参见示例 3)或 orderByValue(见示例 4)

示例 1:

firebase.database().ref("users").once('value')
.then(snapshot => {
  const sortedUsers = snapshot.sort((userA, userB) => {
    if (userA.name < userB.name) {
      return -1;
    }
    if (userA.name > userB.name) {
      return 1;
    }
    return 0;
  })
})

示例 2:

var ref = firebase.database().ref("dinosaurs");
ref.orderByChild("height").on("child_added", function(snapshot) {
  console.log(snapshot.key + " was " + snapshot.val().height + " m tall");
});

示例 3:

var ref = firebase.database().ref("dinosaurs");
ref.orderByKey().on("child_added", function(snapshot) {
  console.log(snapshot.key);
});

示例 4:

var scoresRef = firebase.database().ref("scores");
scoresRef.orderByValue().limitToLast(3).on("value", function(snapshot) {
  snapshot.forEach(function(data) {
    console.log("The " + data.key + " score is " + data.val());
  });
});

注意:示例中可能存在拼写错误,我写这些只是为了向您展示概念的概念。

查看以下文档了解更多信息:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

https://firebase.google.com/docs/reference/js/firebase.database.Query#orderByChild

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

希望对你有帮助

【讨论】:

  • 谢谢你,我明白了。那么,如果我必须在客户端获取和排序大量查询,Firebase 是否与中型项目相关?
  • 就个人而言,我在使用 firebase 作为数据库存储时遇到了一些性能问题,因为它没有被索引,所以您对更复杂的查询有一些限制(花式 where 子句、连接、分页不是那么好等),它的数据结构也有一些限制,特别是当你需要数据关系时。在他们发布 Cloud Functions 之后,情况有所好转,因为您可以在服务器端运行一些查询并从客户端请求更少的内存。但我仍然认为在更大的应用程序中使用它不是一个好主意。但是,其他功能,如 oauth、短信验证和推送都很棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多