簡單SQL查詢 在野狗中的對應實現

SQL2

野狗實時後端雲主要提供的是一個實時通訊的通道,可是畢竟也提供了數據存儲的功能。所以野狗也能夠被看做是一個具備實時同步數據功能的雲端數據庫。web

這個數據庫是NoSQL的,數據的存儲是樹型的,相似一個巨大的JSON,而不是關係型的二維表結構。對於有SQL技術背景的用戶來講,使用野狗須要一個思惟轉換的過程。須要注意的是,雖然今天咱們來討論一些常見的SQL查詢在野狗中如何對應的實現,咱們仍然不建議待着關係型數據庫的思惟使用野狗雲。sql

咱們將會討論以下幾種查詢:數據庫

根據一個用戶的id查詢用戶(WHERE id = x)
根據email查詢用戶(WHERE email = x)
查詢昨天發表的消息(WHERE time BETWEEN x AND y)
排序取x條(ORDER BY time LIMIT x)
經過id字段關聯查詢(FROM table1 JOIN table2 USING id)後端

咱們一樣以JavaScript爲例,Android和iOS平臺相似。本文中所講述的內容嚴重依賴於下列API的正確理解和使用,對這些API還不瞭解的用戶,請參考API文檔(https://z.wilddog.com/web/api):api

orderByChild:按照指定子節點的值排序。
startAt:查詢值範圍的起點。若是沒有明確的指定orderBy屬性,則默認按照數據的priority排序。
endAT:與startAt對應,查詢值範圍的結束點。
limitToFirst/limitToLast:返回多少條數據記錄,至關與sql中的limit。微信

根據一個用戶的id查詢用戶(WHERE id = x)

根據id查詢用戶,這是最基礎的查詢。在野狗中,全部的數據都擁有一個惟一的URL,數據是存儲在一個path路徑下的,path中的字段名key便可被認爲是記錄的主鍵id。例如咱們在/user路徑下存儲了每一個用戶的信息:數據結構

數據中的123,234,345,456就是四條記錄的id。那麼當根據id查詢user的時候,咱們只須要使用數據的URL進行查詢:app

var ref = new Wilddog("https://.wilddogio.com/user/2");

ref.once('value', function(snapshot) {

console.log('I fetched a user!', snapshot.val());

});

根據email查詢用戶(WHERE email = x)

使用id對數據進行查詢是很簡單的,由於id已經在數據的URL中。若是咱們要查詢的字段再也不URL中呢?咱們查找email爲zhangsan@wilddog.com的用戶,須要結合使用orderByChild()方法和startAt()和endAt()方法:性能

var ref = new Wilddog("https://<appId>.wilddogio.com/user");

ref.orderByChild('email')

.startAt('zhangsan@wilddog.com')

.endAt('zhangsan@wilddog.com')

.once('value', function(snapshot) {

console.log('accounts matching:', snapshot.val())

});

查詢昨天發表的消息(WHERE time BETWEEN x AND y)

假設數據結構以下:fetch

要對time字段進行範圍查詢,一樣結合使用orderByChild()方法和startAt()和endAt()方法:

ref.orderByChild('time')

.startAt(startTime)

.endAt(endTime)

.once('value', function(snapshot) {

console.log('messages found : ', snapshot.val())

});

排序取x條(ORDER BY time LIMIT x)

假設每一個用戶都有一個age字段,要按age排序,查詢年齡最小的兩個user,能夠構造以下的查詢:

var ref = new Wilddog("https://<appId>.wilddogio.com");

ref.child('user').orderByChild('age').limitToFirst(2).on('child_added', function(userSnap) {

console.log('find user : ' + JSON.stringify(userSnap.val()));

});

若是要取年齡最大的2個user,將limitToFirst(2)改成limitToLast(2)便可。

經過id字段關聯查詢(FROM table1 JOIN table2 USING id)

有時候咱們出於查詢性能的考慮,爲了不一次從雲端傳輸太大的數據量,咱們將一部分數據拆分出去存儲在另外的數據路徑下。假設咱們的每位user都有本身的media屬性,而咱們將media屬性拆分出去存儲,數據以下:

這時候可能須要在查詢的時候進行一個相似關係數據庫中的JOIN查詢:

var ref = new Wilddog("https://<appId>.wilddogio.com");

ref.child('user/123').once('value', function(userSnap) {

ref.child('media/123').once('value', function(mediaSnap) {

console.log('user:' + userSnap.val().name + ', media : ' + mediaSnap.val().weibo);

});

});

若是不是指定id爲123的用戶,而是查詢全部的用戶:

var ref = new Wilddog("https://<appId>.wilddogio.com");

ref.child('user').on('child_added', function(userSnap) {

var id = userSnap.key();

ref.child('media').child(id).once('value', function(mediaSnap) {

console.log('user:' + userSnap.val().name + ', media : ' + mediaSnap.val().weibo);

});

});

出於性能的考慮,在「關聯查詢」的時候,應當在「外層查詢」使用startAt(),endAt()等方法增長篩選條件,只對較少數據量進行「內層查詢」。野狗爲實時進行了許多優化,只要數據量不是太大,實時性和性能就不用太擔憂。

本文中咱們講述了一些最簡單和基礎的查詢,更多高級查詢和特性咱們將在後續的文章中爲你們講述。

圖片描述 關注野狗官方微信,獲取更多技術乾貨

相關文章
相關標籤/搜索