2015-04-05 150 views
2

我不明白为什么我对我的Firebase数据库的查询不起作用。我是新来的,并决定遵循一个“简单的教程”来读取数据。编写JSON对象很有用,很高兴看到这一点。另一方面阅读开始让我生气。我唯一想做的事情是阅读1“记录”,其中电子邮件地址等于某个电子邮件地址。这些在用户数据库中是并且应该是唯一的。一旦我找回用户,我就可以使用他的UID,即push()上自动生成的值来做其他事情。因此,这是一个演示,我现在不关心安全性,新创建的Firebase数据库的默认读取和写入行为均适用。任何人都可以随时随地进行完整的读写访问。Firebase:查询返回null

这是演示网站的代码,看看东西的作品

<body> 
    <h1>retrieve data</h1> 
    <div id="aaa" style="margin:20px;padding:20px;border-radius:30px;background-color:#6666FF;float:left">USERADD</div> 
    <div style="clear:both"></div> 
    <pre id="rawdata"></pre> 
</body> 

这是工作

var demofbdb = new Firebase("https://examples-sql-queries.firebaseio.com/user"); 

demofbdb 
.startAt('[email protected]') 
.endAt('[email protected]') 
.once('value', function show(record) { 
    $('#rawdata').text(JSON.stringify(record.val(), null, 4)); 
}); 

这是我的代码演示代码,但返回null,我不知道为什么

var demofbdb = new Firebase("https://<my-firebase-database>.firebaseio.com/Users"); 

demofbdb 
.startAt('[email protected]') 
.endAt('[email protected]') 
.once('value', function show(record) { 
    $('#rawdata').text(JSON.stringify(record.val(), null, 4)); 
}); 

这是结构/用户

"-JlyxV5xvQFLybevk9kD" : { 
    "AccountExpireDate" : "31/03/2016", 
    "AccountStartDate" : "01/04/2015", 
    "Alias" : "het hol van pluto", 
    "Attended" : { 
     "-JlyxMApRwcniJLXfqbU" : true 
    }, 
    "Birthday" : "01/01/1970", 
    "E-Mail" : "[email protected]", 
    "FirstName" : "Demo", 
    "LastName" : "De Demoon", 
    "MemberOf" : [ "-JlyxMqpRw5nrJLef9bU" ], 
    "OrganizationID" : "", 
    "Password" : "abc123!" 
}, 
"-JlyxSJ8MciBNxguT415" : { 
    "AccountExpireDate" : "31/03/2016", 
    "AccountStartDate" : "01/04/2015", 
    "Alias" : "jos-het-debiele-ei", 
    "Attended" : { 
     "-JlyxMApRwcniJLXfqbU" : true 
    }, 
    "Birthday" : "01/01/1970", 
    "E-Mail" : "[email protected]", 
    "FirstName" : "Jos", 
    "LastName" : "Jossers", 
    "MemberOf" : [ "-JlyxMqpRw5nrJLef9bU" ], 
    "OrganizationID" : "", 
    "Password" : "abc123!" 
} 

为了阐明这种结构,“UID”直接位于用户的下面。当UID展开时,我们会看到细节。

我的查询的预期结果是用户的名字是“Demo”,他的姓氏是“De Demoon”的一个JSON对象。

在此先感谢

PS:我更熟悉SQL数据库比NOSQL。我有点不得不使用这最后一个,除了我看到noSQL数据库更有用,更强大,当我们有“预计算数据”时,这些数据可以存储在关系数据库中,但始终需要通过相同的联接以一种方式。将这些结果计算(加入)一次,并将结果写入noSQL数据库,通过减少不必要的负载并将通常请求的数据集分组在一起,使查找速度更快。如果我错了,请纠正我的视力。

回答

5

在您看到的演示中,Michael Wulf在添加的每条记录上使用setPriority。如果您不这样做,那么通常您会在startAt之前致电orderByChild。在你的情况,这会做你想要什么:

var demofbdb = new Firebase("https://<my-firebase-database>.firebaseio.com/Users"); 

demofbdb 
.orderByChild('E-Mail') 
.startAt('[email protected]') 
.endAt('[email protected]') 
.once('value', function show(record) { 
    $('#rawdata').text(JSON.stringify(record.val(), null, 4)); 
}); 

要设置像演示的数据,你可以做这样的事情:

function createDemoData(){ 
    var users = { 
     "123": { 
      "email": "[email protected]", 
      "name": "Kato" 
     }, 
     "234": { 
      "email": "[email protected]", 
      "name": "Anant" 
     }, 
     "345": { 
      "email": "[email protected]", 
      "name": "Michael" 
     }, 
     "456": { 
      "email": "[email protected]", 
      "name": "Kavya" 
     } 
    }; 

    var fbdbref = new Firebase("https://<my-firebase-database>.firebaseio.com/user"); 
    fbdbref.set(users); 

    fbdbref.child("123").setPriority("[email protected]"); 
    fbdbref.child("234").setPriority("[email protected]"); 
    fbdbref.child("345").setPriority("[email protected]"); 
    fbdbref.child("456").setPriority("[email protected]"); 
} 

现在,你可以通过email不使用orderByChild查询,就像在演示中一样。

+0

我的救主! orderByChild修复它。没有注意到这是必要的,除非使用setPriority。以为我可以将数据推送到firebase并查询它,看起来像我认为是错误的。我在猜测时发生的事情。 – jonny8bit 2015-04-07 21:13:49