好的,所以我一直在阅读和阅读,搜索和搜索,奇怪的是,我的情景似乎并没有被任何地方覆盖。
我有一个可以创建产品列表的应用。我想要一个简单的视图,可以对产品和页面进行排序。
此处的Fore引用是Firebase中数据的简单表示。
app
stock
unique_id
name
url
imageUrl
price
创建列表时,我在firebase引用上使用push
方法有多个线程:
new Firebase(firebaseUrl).child('stock').push({
name: "name",
price: 123
});
这为我在应用程序的stock
属性上提供了一个可爱的“哈希”集合。
所以我现在要做的是有一个表来排序和翻页放在stock
哈希中的记录。
我向我的服务器发送GET请求到/stock?limit=10&skip=10&sort=name%20asc
这样的网址。此特定URL将是第二页,其中表每页包含10条记录,并按name
属性按升序排序。
目前在我的查询处理程序中我有这个:
var firebaseRef = new Firebase(firebaseUrl).child('stock');
if (this.sortDesc) {
firebaseRef = firebaseRef
.orderByChild(this.sortProperty)
.endAt()
.limitToFirst(this.limitAmount);
} else {
firebaseRef = firebaseRef
.orderByChild(this.sortProperty)
.limitToFirst(this.limitAmount);
if (this.skipAmount > 0) {
firebaseRef = firebaseRef.startAt(this.skipAmount);
}
}
firebaseRef.once('value', function (snapshot) {
var results = [];
snapshot.forEach(function (childSnapshot) {
results.push(childSnapshot.val());
});
callback(null, results);
});
我遇到了几个问题。我将把它分成两种情况,即升序和降序查询。
升序查询
orderByChild
和limitToFirst
似乎在排序升序的情况下正常工作。这意味着我可以更改哪个属性具有升序排序以及要返回多少结果。我无法开始工作的是跳过n
条记录进行分页工作。在上面的示例查询中,我将转到第二页。我没有得到结果11-20,但我得到与第一页相同的10条记录。
降序查询
在这种情况下,我无法开始弄清楚如何通过降序方式告诉Firebase按唯一键标识的对象的属性进行排序。我最接近的是使用endAt()
然后使用limit
。文档说limit
已被弃用,但这对我的任何分页都没有帮助。
我厌倦了做涂鸦,想象这是如何运作的。我想出了:按照属性排序,从集合的“结束”开始,然后限制回页面大小。虽然这仍然无法解决分页问题,但我希望它能够提供最后n
个记录,其中n
是页面的大小。我没有结果。
我想我可以说使用firebaseRef = firebaseRef .orderByChild(this.sortProperty).limitToLast(this.limitAmount + this.skipAmount);
并在结果回调中使用forEach
循环来获取第一个(或者它将是最后一个;我不确定该迭代将如何工作) n
记录n=this.limitAmount
的位置。这似乎效率低下。是不是更好的限制查询而不是使用CPU周期来限制通过线路传输的数据,或者这是关系数据库查询思维模式是否覆盖了NoSQL的正确思维过程?
进一步混乱
发布后我仍然在研究解决方案。我已经接近了一些事情,但我也遇到了这个过滤问题。如何通过仍然在另一个属性上进行排序来将一组项目过滤到一个属性?哎呀!我希望用户能够获得所有未售完的库存并按价格订购。
最后
为什么这个基本示例没有在任何Firebase“入门”页面上充实?能够显示表格数据,页面浏览,排序和过滤似乎是每个 Web开发人员会遇到的事情。我在Angular应用程序中使用ng-table来驱动视图,但无论平台如何,我试图生成的查询在Firebase支持的任何平台上都是实用的。也许我错过了什么!请教育我!
Firebase和NoSQL
我想出了这个简单的场景,我经常遇到Web应用程序。我想显示表格数据,过滤,页面和排序。非常简单。很普通的。为此编写SQL语句非常容易。为什么查询对于类似Firebase的内容来说如此复杂。这在所有NoSQL解决方案中都很常见吗?没有存储关系数据,因此对关系数据库的需求似乎是不必要的。然而,似乎我可以将一个小平面文件组合在一起来执行此存储,因为使Firebase执行这些简单任务的能力在其API或Docs中并不明确。的沮丧!!!