天道酬勤,学无止境

Querying data from Firebase using multiple filters

I have a Firebase array called products that contains items like this one:

JhMIecX5K47gt0VaoQN: {
    brand: "Esprit"
    category: "Clothes",
    gender: "Boys",
    name: "Pants",
}

Is it possible to query products from this array using multiple filters with the Firebase API. For example I might want to filter by brand and category (all "Pants" by "Esprit"). So far I've tried ordering by child key and then limiting the start and end of this ordering, but I can't figure out how to apply more filters.

I'm using the iOS SDK.

评论

Firebase can only order/filter on one property (or value) at a time. If you call a orderBy... method multiple times in a single query it will raise an error to indicate this is not allowed.

Actually, in Firebase, when you order by a specific key, there is another index involved : push IDs (if you use them) They are almost perfectly ordered chronologically, so you order by field XXX plus Time.

More details here

In your case, this is not about time, so the only solution is to use additional composite indexes :

JhMIecX5K47gt0VaoQN: {
    brand: "Esprit"
    category: "Clothes",
    brandcategoryIndex: "EspritClothes",
    categorybrandIndex: "ClothesEsprit",
    brandnameIndex: "EspritPants",
    namebrandIndex: "PantsEsprit",
    gender: "Boys",
    name: "Pants",
}

In the above example, you can query by :

  • Category > Brand (and the other way)
  • Name > Brand (and the other way)

Just make sure you add those fields to your Firebase index in the rules section, and that you maintain them anytime the items are modified.

(this process of adding a cost of redundant data at the benefit of performance, which is forced by Firebase in this case, is called denormalization)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Cloud Firestore和Firebase实时数据库之间有什么区别?(What's the difference between Cloud Firestore and the Firebase Realtime Database?)
    问题 Google刚刚发布了Cloud Firestore,这是他们针对应用程序的新文档数据库。 我一直在阅读文档,但是在Firestore和Firebase DB之间看不出很多区别。 重点是,与Firebase(具有JSON基础的传统noSQL数据库)相比,Firestore使用的文档和集合可轻松使用查询。 我想进一步了解它们的区别或用途,或者Firestore是否只是用来替换Firebase DB? 回答1 因此,我写了一篇有关此问题的完整博客文章,建议您查看一下(或官方文档)以获得更完整的答案。 但是,如果您需要快速的(-ish)摘要,则为: 更好的查询和更结构化的数据-实时数据库只是一棵巨大的JSON树,而Cloud Firestore则更加结构化。 您的所有数据均由文档(基本上是键值存储)和集合(即文档的集合)组成。 文档还将经常指向子集合,这些子集合包含其他文档,它们本身也可以包含其他文档,依此类推。 这种结构化数据可以通过两种方式帮助您。 首先,所有查询都是浅层的,这意味着您可以在不获取其下所有数据的情况下请求文档。 这意味着您可以以对您更有意义的方式分层存储数据,而不必担心使数据库变浅。 其次,您拥有更强大的查询。 例如,您现在可以跨多个字段进行查询,而不必创建那些组合(和去规范化)数据库其他部分数据的“ combo”字段。 在某些情况下,Cloud
  • 使用Firebase筛选和排序多个值(Filter and sort on multiple values with Firebase)
    问题 我正在使用Firebase构建社交应用程序。 我将帖子存储在Firebase中,如下所示: posts: { "postid": { author: "userid" text: "", date: "timestamp" category: "categoryid" likes: 23 } } 每个帖子都属于一个类别,可以喜欢这些帖子。 现在,我试图显示属于特定类别的帖子,并按喜欢的数量排序。 我也可能想按日期限制过滤器,以仅显示类别中最新,最喜欢的帖子。 我怎样才能做到这一点? Firebase查询功能似乎不支持这样的多个查询,这似乎很奇怪。 回答1 您只能对Firebase数据库查询使用一种排序功能,但是适当的数据结构将允许您按多个字段进行查询。 根据您的情况,您想按类别订购。 与其将category作为属性,不如将其作为posts下的索引: posts: { "categoryid": { "postid": { author: "userid" text: "", date: "timestamp", category: "categoryid", likes: 23 } } } 现在,您可以编写查询来获取特定类别下的所有帖子。 let postsRef = Firebase(url: "<my-firebase-app>/posts") let
  • 使用Firebase的数据库样式查询(Database-style Queries with Firebase)
    问题 有没有一种快速的方法来使用Firebase执行数据库样式的查询? 例如: 给定一个Firebase参考users ,其users字段为user_id , name和age ,那么执行类似于以下查询的最佳方法是什么: SELECT name FROM users WHERE `user_id`=147; 和 SELECT COUNT(*) FROM users WHERE age=21; 回答1 一般来说,不可以。 Firebase本质上是一个“实时数据库”,随着数据的变化不断向您流式传输更新,因此进行通用查询变得更加困难。 目前,提供了两个(公认的有限)查询原语。 请参阅文档中的“查询/限制”页面。 您通常可以通过多种方法来解决这些限制: 智能地使用位置名称和优先级。 如果将数据构造为/ users / [userid] / name,则只需检索/ users / 147 / name即可完成第一个“查询”。 如果您知道要按年龄查询,则可以将年龄作为用户节点的优先级,然后执行“ usersRef.startAt(21).endAt(21).on('child_added',...)”让所有用户都达到21岁。您仍然必须手动计算他们。 进行客户端查询。 如果整个数据集很小,则可以检索整个数据集,然后在客户端上手动进行过滤/处理。 运行单独的服务器。 它可以连接到Firebase
  • 在 Firebase 中查询数据时是否还有类似 ~ 的运算符(Are there any more operators like ~ when querying data in Firebase)
    问题 我注意到此处的 firebase 文档中的“~”符号 var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); ref.orderByKey().startAt("b").endAt("b~").on("child_added", function(snapshot) { console.log(snapshot.key()); }); 是否还有其他表达式,如“~”可以在 firebase 中使用? 我很好奇是否有一个操作符像.contains(string)而不是获取所有然后过滤数据。 我试图让自己远离弹性搜索。 回答1 据我所知,Firebase API 中没有.contains这样的东西。 最好的办法是编写一个实用函数来获取数据并为您过滤数据。
  • How to apply multiple filter in Firebase query in Swift?
    I am trying developing an application like Taxi booking and storing data on Firebase. But, I am facing problem while querying data for RideDetail(History) from Firebase. I want to fetch ride_detail for specific "customer_id" in pagination form. My Firebase DataStructure: { "ride_details": { "NuEoP2WNPwigsbY1FQy9M150131918189233": { "customer_id": "tstebwLlf4OCRdWhNKO9XCO08xY2", "destination_address": "New Ranip\nNew Ranip\nAhmedabad\nGujarat 380081\nIndia", "destination_lang": 72.55924470000001, "destination_latg": 23.0930152, "discount": "10%", "driver_id": "cIyZQIJ7tsdvF1a9KpRrKucF2o62",
  • Are there any more operators like ~ when querying data in Firebase
    I notice the '~' sign in the firebase documentation here var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs"); ref.orderByKey().startAt("b").endAt("b~").on("child_added", function(snapshot) { console.log(snapshot.key()); }); are there other expressions like '~' that can be use in firebase? I'm curious if there's a operator that acts like .contains(string) rather than fetching all then filter the data. I'm trying to keep my self away from elastic search.
  • 在Firebase中查询多个值,类似于IN()SQL功能(Query on multiple values in Firebase, similar to IN() SQL functionality)
    问题 我有一个看起来像这样的数组: validZipCodes = [ "84606", "84605", "84601" ] 我正在查询一些这样的数据: var Jobs = firebase.child('Jobs'); 我尝试了这个: var Jobs = firebase.child('Jobs').orderByChild('ZipCode').equalTo($scope.validZipCodes); 但是它返回了一个错误消息,表明它是无效的数据类型,无论如何都要说出这样的话: var Jobs = firebase.child('Jobs').orderByChild('ZipCode').inArray($scope.validZipCodes); 或类似的东西。 请注意,这是一个数组比较,而不是查询对象中的文本。 回答1 这是我最终的做法: 使用foreach命令,您可以轻松地处理数据,然后将其推入数组以重新创建数据集合,但是您需要它。 $scope.validZipCodes = []; $scope.validContractorJobs = []; var Jobs = firebase.child('Jobs'); contractorJobs.on('value', function(snap) { snap.forEach(function(job)
  • Querying By Multiple Keys in Firebase
    I have a list of known keys in my Firebase database -Ke1uhoT3gpHR_VsehIv -Ke8qAECkZC9ygGW3dEJ -Ke8qMU7OEfUnuXSlhhl Rather than looping through each of these keys to fetch a snapshot of their respective object, how can I query for each of these keys in one single, unified request? Does Firebase provide this? I've discovered the Promise.all() function which looks promising (no pun intended I swear) but I'm not sure how to implement it using the standard way of fetching firebase data like so var userId = firebase.auth().currentUser.uid; return firebase.database().ref('/users/' + userId).once(
  • querying firebase efficiently
    I want to search my user base from each users name value. From what I've seen online people often return all users then filter them in a table view but that doesn't seem practical nor viable. My thought was to query data and return an exponentially smaller array of values but I am having trouble using the query methods provided. How do I query a specific aspect of my database? How do I structure my code so that it's viable; not loading in EVERY user, something like 10 max at a time. Any suggestions, resources, and links are greatly appreciated. EDIT: I did some researching and it looks like
  • querying nested data in firebase
    Now that the new query capabilities are out, I'm going to ask this question. It's similar to other questions where the answers were based on the old API. Example Data : { "accounts" : { "simplelogin:001" : { "email" : "test1@test.com", "mobile" : "+15555551001", ... many more fields }, "simplelogin:002" : { "email" : "test2@test.com", "mobile" : "+15555551001", ... many more fields }, "simplelogin:003" : { "email" : "test3@test.com", "mobile" : "+15555551003", ... many more fields } } I was hoping the new query capabilites would allow querying nested data. However, based on what I see, in
  • 使用Geofire + Firebase过滤结果(Filtering results with Geofire + Firebase)
    问题 我试图弄清楚如何使用Geofire进行过滤查询。 假设我有不同类别的餐厅。 并且我想将该类别添加到我的查询中。 我该怎么办? 我现在使用的一种方法是使用Geofire查询键,对每个键运行for循环并获取餐厅,然后将适当的餐厅插入数组。 这些似乎效率很低。 还有其他解决方法吗? 理想情况下,我将获得过滤后的结果,并且仅在将要显示它们时才加载它们。 干杯! 回答1 Firebase查询只能按一种条件进行过滤。 Geofire已经做了一些“魔术”操作,可以对经度和纬度进行过滤。 可以在该方程式中添加其他属性,但这远远超出了Geofire默认处理的范围。 请参阅GeoFire:如何在查询中添加其他条件? 如果您一次只想访问一个类别,则可以将餐馆放在每个类别的顶级节点中,然后将Geofire指向一个类别。 /category1 item1 g: "pns0h0mf2u" l: [-53.435719, 140.808716] item2 g: "u417k3dwub" l: [56.83069, 1.94822] /category2 item3 g: "8m3rz3s480" l: [30.902225, -166.66809] /items item1: ... item2: ... item3: ... 在上面的例子中,我们有两大类: category1
  • Query on multiple values in Firebase, similar to IN() SQL functionality
    I have an array that looks like this: validZipCodes = [ "84606", "84605", "84601" ] I'm querying some data like this: var Jobs = firebase.child('Jobs'); I tried this: var Jobs = firebase.child('Jobs').orderByChild('ZipCode').equalTo($scope.validZipCodes); But it returned an error that it was an invalid data-type, is there anyway to say something like: var Jobs = firebase.child('Jobs').orderByChild('ZipCode').inArray($scope.validZipCodes); Or something like that. Note that this is an array comparison & not querying text in an object.
  • 从Firebase查询数据(Querying data from firebase)
    问题 我正在尝试从Firebase数据库中获取项目列表...但是获取它们时遇到了问题。 我的代码大致如下所示: List<Items> itemsList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_work_items_report); itemsList = GetItems(); } 和应该返回我的项目的方法如下所示: private ArrayList<Items> GetItems(){ DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference ref = database.child("items"); final ArrayList<Items> itemsRez = new ArrayList<Items>(); Query itemsQuery = ref.orderByChild("type"); itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
  • Firestore:按文档数组中的项目查询(Firestore: Query by item in array of document)
    问题 我有一个文档“用户”,其中有一个名为“照片”的钥匙。 这是要保存的字符串数组,即“照片”文档的ID。 我想通过“照片”字段查询“用户”:我希望所有在“照片”属性中具有此ID的用户。 可以通过消防站来做到这一点吗? 回答1 添加了“ array-contains”查询运算符,可与.where()一起使用,以查找其中数组字段包含特定元素的文档。 https://firebase.google.com/support/release-notes/js 5.3.0 更新:也可在@google-cloud/firestore :https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0 更新2 https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html Admin Node.js SDK v6.0.0中现已提供Update 3 https://github.com/firebase/firebase-admin-node/releases 回答2 请参阅亨利的答案,因为我们还没有使“数组包含”查询可用。 不幸的是,尽管它已经在我们的路线图上。 同时,您将需要使用以下形式的地图: photos: { id1: true
  • Firebase查询数据(Firebase querying data)
    问题 { "random_key 1" : { "id": 0, "text": "This is text" }, "random_key 2" : { "id": 1, "text": "This is text" } } 如果我以这种方式存储数据,并且想要获得id等于0的节点。 我怎样才能做到这一点? 以上是issue的root 。 回答1 在您的情况下,您将必须设置如下查询: DatabaseReference reference = FirebaseDatabase.getInstance().getReference(); Query query = reference.child("issue").orderByChild("id").equalTo(0); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { // dataSnapshot is the "issue" node with all children with id 0 for (DataSnapshot issue : dataSnapshot
  • Querying data from firebase
    I am trying to get a list of items from my firebase database...but I have a problem obtaining them. My code looks more or less like this: List<Items> itemsList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_work_items_report); itemsList = GetItems(); } and the method that should return my items looks like: private ArrayList<Items> GetItems(){ DatabaseReference database = FirebaseDatabase.getInstance().getReference(); DatabaseReference ref = database.child("items"); final ArrayList<Items> itemsRez = new ArrayList<Items>
  • 根据 Firebase 中的多个子属性过滤产品(Filter products on multiple child properties in Firebase)
    问题 我最近询问了如何根据产品的子属性过滤产品(请参阅:基于 Firebase 中的子子项过滤产品)。 总结一下,我的结构如下: products/ product1 /author: 12345 /title: "Awesome" /category: "catA" /description: "more awesome" product2 /author: 67890 /title: "Other" /category: "catB" /description: "otherawesome" product3 /author: 12345 /title: "Billy" /category: "catB" /description: "otherawesome" 要过滤掉作者为12345所有产品,我们可以简单地使用: ref.child("products").orderByChild('author').equalTo(12345)... 但是,当我有多个AND语句或多个OR语句时怎么办? 那么如果我想过滤掉怎么办: 所有产品与笔者12345和类别catA (收益product1 ) 作者为12345或作者为 67890 的所有产品(返回product1和product3 ) 对于第一部分,我尝试了: ref.child("products").orderByChild(
  • How to use startAt(double value, String key) and endAt(double value, String key) Firebase RealTime Database in Android
    I want to do a query by using orderByChild and also filtering with the key of those child. In this case, my keys and values are both data that works for querying what I want. My problem is presented when the keys contains numbers, if the keys only have letters, then there is no problem. I'm trying to maintain always letters along the numbers since I read the recommendation in another answer directly from a firebaser. My json is: { "my_list":{ "100xyz":{ "value1": 100, "value2": 100, "name":"100xyz" }, "200xyz":{ "value1": 200, "value2": 200, "name":"200xyz" }, "300xyz":{ "value1": 300, "value2
  • Firestore获取数据时性能下降的问题(Firestore slow performance issue on getting data)
    问题 与存储比例为1/10的实时数据库相比,检索存储在文档中的基本数据时,Firestore的性能存在问题。 使用Firestore,首次通话平均需要3000毫秒 this.db.collection(‘testCol’) .doc(‘testDoc’) .valueChanges().forEach((data) => { console.log(data);//3000 ms later }); 使用实时数据库,第一次通话平均需要300毫秒 this.db.database.ref(‘/test’).once(‘value’).then(data => { console.log(data); //300ms later }); 这是网络控制台的屏幕截图: 我正在使用AngularFire2 v5.0 rc.2运行Javascript SDK v4.50。 有人遇到这个问题吗? 回答1 更新:2018年2月12日-iOS Firestore SDK v0.10.0 与其他评论者相似,我也注意到对第一个get请求的响应速度较慢(后续请求大约需要100ms的时间)。 对我来说,这不像30s那样糟糕,但是当我具有良好的连接性时,它可能约为2-3s,这足以在我的应用程序启动时提供糟糕的用户体验。 Firebase建议他们知道此“冷启动”问题,并且正在为此进行长期修复-不幸的是
  • 使用 Firebase (Swift) 按姓名或电子邮件地址查询用户(Query users by name or email address using Firebase (Swift))
    问题 我对Firebase和Swift很陌生,在查询时遇到了一些麻烦。 所以基本上有两件事我想做: 查询我的用户并仅查找名称(或电子邮件地址)中包含特定字符串的用户并将其添加到数组中。 获取我的所有用户并将它们添加到数组中。 我这个问题的相关数据部分如下所示: 如您所见,我正在使用 Firebase 的 simplelogin(稍后我也想添加 Facebook 登录),并且我正在通过他们的 uid 存储我的用户。 我的规则文件的一部分如下所示: "registered_users": { ".read": true, ".write": true, ".indexOn": ["name"] } 所以每个人都应该对我的这部分数据有读写权限。 我还在他们的网站上阅读了 Firebase iOS 指南的“检索数据”部分,根据该指南,我获取所有用户名和电子邮件地址的代码应该可以工作,至少我是这么认为的。 但事实并非如此。 这是我的代码: func getUsersFromFirebase() { let registeredUserRef = firebaseRef.childByAppendingPath("registered_users") registeredUserRef.queryOrderedByChild("name").observeSingleEventOfType(