我是Firebase的新手。执行查询时遇到问题:
new Firebase("https://blazing-fire-2739.firebaseio.com/users")
.startAt($scope.user.email) //karank@ocodewire.com
.endAt($scope.user.email)
.once('value', function(snap) {
console.log('accounts matching email address', snap.val())
});
这显示我为空。
在Firebase中:
users
-JxFNEu31LJ0Efy8PnX5
email: karank@ocodewire.com
firstname:karan
lastname: sofat
请帮助
答案 0 :(得分:2)
在Query.startAt()
和Query.endAt()
的文档中,在' Arguments'下,您会看到第一个参数value
是:
开始[或结束]的值。参数类型取决于此查询中使用的
orderBy*()
函数。指定与orderBy*()
类型匹配的值。与orderByKey()
结合使用时,该值必须为字符串。
Querying Data section of the Web Guide说,
使用Firebase数据库查询,我们可以根据各种因素有选择地检索数据。要在数据库中构建查询,首先要指定使用其中一个排序函数对数据进行排序的方式:
orderByChild()
,orderByKey()
,orderByValue()
或{{1} }。然后,您可以将这些方法与其他五种方法结合起来进行复杂查询:orderByPriority()
,limitToFirst()
,limitToLast()
,startAt()
和endAt()
。
equalTo()
指定orderBy,则查询将按优先级排序,并且index by startAt / endAt将起作用。您可以使用.setPriority()
或.setWithPriority()
。Query
没有Query
,则orderBy*()
将为空。对于您的查询,如果用户对象没有设置优先级,则snapshot.val()
子项进行排序会使email
/ startAt
正常工作,如下所示:
endAt
以下是此查询的有效plnkr example。
但是,正如加藤在评论中指出的那样,
"作为一般性建议,
new Firebase("https://blazing-fire-2739.firebaseio.com/users") .orderByChild('email') .startAt($scope.user.email) .endAt($scope.user.email) .once('value', function(snap) { console.log('accounts matching email address', snap.val()) });
取代优先级,应该是首选。优先事项最终将逐步取消,以支持儿童领域。"
由于您的目标是通过电子邮件地址找到单个特定用户,并且因为只有一个用户具有给定的orderByChild()
子级值,您可以
email
子密钥为Query
订购/users
个对象; "email"
孩子为email
的用户对象。例如:
equalTo(<email>)
这是第二个查询的工作plnkr example。
有关详细信息,请查看Query.equalTo()
和Query.orderByChild()
的文档。
重要的注意事项:按子键进行排序时,如果您知道查询的索引是什么,&#34;您可以通过Security and Firebase Rules中的var usersRef = new Firebase("https://blazing-fire-2739.firebaseio.com/users");
userRef.orderByChild("email").equalTo($scope.user.email).once("value", function(snapshot) {
if(snapshot.exists()){
console.log(snapshot.val());
}
});
规则定义它们。更好的表现。&#34;查看Indexing Data documentation了解详情。
要在浏览器中检查Firebase数据并查看对象&#39;优先级,您可以使用Vulcan - 一个非常棒的Google Chrome扩展程序。这就是Vulcan在Chrome DevTools中的样子:
希望这有帮助!
答案 1 :(得分:0)
.startAt
和endAt
不接受字符串,它接受一个开始/结束的数字。所以你必须改为
new Firebase("https://blazing-fire-2739.firebaseio.com/users")
.startAt(1)
.endAt(50)
.once('value', function(snap) {
console.log('accounts matching email address', snap.val());
});
或者完全忽略endAt()
。