处理firebase中的复杂查询

时间:2015-04-19 03:44:05

标签: firebase angularfire

我正在使用离子框架和FIREBASE作为后端开发购物车移动应用程序。我需要通过多个数据属性加入JOIN,SORT,FILTER和PAGINATE。

下面给出了样本数据结构。

产品:{

prod1:{
    name: Samsung-s4,
    type: pro,
    category: Phone,
    created_datetime: 1426472828282,
    user: user1,
    price: 400

},

prod2:{
    name: iPhone 5s,
    type: pro,
    category: Phone,
    created_datetime: 1426472635846,
    user: user2,
    price: 500

},

prod3:{
    name: HP Laptop i3,
    type: regular,
    category: Computer,
    created_datetime: 1426472111111,
    user: user1,
    price: 600

}

}

user_profiles:{

user1:{
    name: abc_user,
    display_name: ABC,
    email: abc@mail.com
},

    user2:{
    name: xyz_user,
    display_name: XYZ,
    email: xyz@mail.com
}

}

我需要使用多种方式查询产品。下面给出两个简单的例子。

1)获取所有带分页的产品,其中type为“pro”,然后按创建日期加入user_profiles和SORT。

2)获取所有具有分页的产品,按类别过滤,然后按创建日期加入user_profiles和SORT。

如上所述,将会有越来越多的过滤选项,例如:价格。

我的主要问题是,我找不到使用FIREBASE查询选项直接执行此操作的方法。我也提到了firebase util文档,但我也没有看到完成这项工作的方法。

据我所知,只有通过将所有数据(或大部分数据)输入客户端并在客户端进行SORT / FILTER / PAGINATE,才能在客户端进行大部分处理。端。

但我们期待这些架构中有数千条记录,因此如果我们在客户端进行处理,会对性能产生巨大影响!!

感谢您的专业知识/支持来解决这个问题。

提前谢谢你。

更新

我更改了数据结构(如webduvet所解释的)并尝试使用firebase-util但未能实现我想要的效果。标准:产品 - >按类型/专业版过滤 - >按产品排序.created_date

输入:{

亲:{

product1: user1,
product3: user1,

...

},   定期:{    ...   }

}

firebase-util - angularfire代码

            var list =  $firebase(new Firebase.util.NormalizedCollection(
                    ref.child("products").orderByChild('created_datetime'),         
                    ref.child('type').child('pro')
                ).select(
                        {key: "products.name" , alias: 'name'}
                ).ref()).$asArray();

“产品”将有十万条记录,因此我们必须确保尽可能多地限制firebase结束而不是在客户端处理。

请帮忙!

1 个答案:

答案 0 :(得分:3)

这不是通过查询而是通过数据库设计完成的。您需要以非规范化方式存储数据,例如:

type: {
  pro:{
    product1: user1,
    product3: user1,
  ...
  },
  regular:{
   ...
  }
}

上述结构将为您提供查询所有专业产品和检索用户ID的选项。 Firebase提供了良好的排序机制,因此不会出现问题。您需要的查询越复杂,需要的数据结构就越复杂,您将拥有更多的非规范化数据。

但正如@Swordfish0321指出的那样,sql类型的db可能会更适合你。