在firebase中查询的位置

时间:2015-08-22 07:21:03

标签: angularjs ionic-framework firebase

我是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

请帮助

2 个答案:

答案 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了解详情。

阅读Retrieving Data Guide

可能会有所帮助

要在浏览器中检查Firebase数据并查看对象&#39;优先级,您可以使用Vulcan - 一个非常棒的Google Chrome扩展程序。这就是Vulcan在Chrome DevTools中的样子:

vulcan

希望这有帮助!

答案 1 :(得分:0)

.startAtendAt不接受字符串,它接受一个开始/结束的数字。所以你必须改为

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()