1. 程式人生 > >meteor集合

meteor集合

Meteor 的核心功能, 那就是伺服器端和客戶端的自動資料同步。

Meteor 集合(Collection)

集合是一個特殊的資料結構,它將你的資料儲存到持久的、伺服器端的 MongoDB 資料庫中,並且與每一個連線的使用者瀏覽器進行實時地同步。

在根資料夾建立一個叫做 collections/ 的資料夾, 並在裡面放一個 posts.js 的檔案。程式碼所在的目錄既不是 client/ 也不是 server/ 所以 Posts 會共同存在執行在伺服器和客戶端。 然而,這個集合的使用在兩種環境下十分不同。

連線到Mongo資料庫

Posts = new Mongo.Collection('posts');

要 Var 還是不要 Var?

在 Meteor 中,關鍵字 var 限制物件的作用域在檔案範圍內。想要 Posts 作用於整個應用範圍內,就不要 Var 這個關鍵字

儲存資料

網路應用有三種基本方式儲存資料,各種方式有不同的角色:

  • 瀏覽器記憶體:像 JavaScript 變數的這些資料會儲存在瀏覽器記憶體中,意味著他們不是永久性的:它們存在於當前瀏覽器標籤中,當標籤關閉後它們會消失。
  • 瀏覽器儲存:瀏覽器也可儲存較為永久性的資料,使用 cookies 或本地儲存 Local Storage。雖然資料會在不同 session 間保持,但是隻是針對於當前使用者(包括標籤之間)但不能輕易地共享給其他使用者。
  • 伺服器端資料庫:你想永久儲存資料並且提供給多個使用者的最好方法是資料庫(MongoDB 是 Meteor 應用預設的方案)。

Meteor 使用所有三種方式,有時會從一個地方同步資料到另一個地方(我們會馬上看到)。話雖如此,資料庫仍然是包含資料主副本的“規範化的”資料來源。

客戶端與伺服器

不在 client/ 或 server/ 資料夾中程式碼會在客戶端和伺服器端執行。所以 Posts 集合在客戶端和伺服器端都可用。但是,在各自環境下所起的作用有很大不同。

在伺服器,集合有一個任務就是和 Mongo 資料庫聯絡,讀取任何資料變化。 在這種情況下,它可以比對標準的資料庫。

在客戶端,集合是一個安全拷貝來自於實時一致的資料子集。客戶端的集合總是(通常)透明地實時更新資料子集。

伺服器端的集合

在伺服器端的程式碼,可以寫像 Posts.insert()或 Posts.update() 這樣的 Mongo 命令,來對 Mongo 資料庫中的 posts 集合進行操作。

meteor mongo 啟動 Mongo Shell 外殼程式

輸入 meteor logs myApp 得到應用的 log 日誌

客戶端集合

當在客戶端申明 Posts = new Mongo.Collection('posts'); 實際上是建立了一個本地的,在瀏覽器快取中的真實的 Mongo 集合。 客戶端集合被"快取"是指它儲存了資料的一個子集,而且對這些資料提供了十分快速的訪問。

因為這是 Meteor 工作的一個基礎: 通常說來,客戶端的集合的資料是 Mongo 資料庫的所有資料的一個子集(畢竟不會想把整個資料庫的資料全傳到客戶端來)。

第二,那些資料是被儲存在瀏覽器記憶體中的,也就是說訪問這些資料幾乎不需要時間,不像去伺服器訪問 Posts.find() 那樣需要等待,因為資料事實上已經載入了。

meteor reset清空資料庫初始化我們的專案

meteor reset

動態資料

動態資料獲取需要使用資料庫方法,所以講資料庫匯入前端client中的main.js中,呼叫方法的是遍歷集合的標籤,將多個數據的陣列,需要通過domain helper方法呼叫。

連線集合: 釋出與訂閱

到此為止,我們仍然用著 autopublish 這個包,這個包並不是為正式產品化的應用程式準備的。正如它的名字陳述的那樣,它簡單地把整個集合分享給所有連線的客戶端。這個可不是我們期望的樣子,所以讓我們去掉它。

開啟一個終端視窗,輸入:

meteor remove autopublish

這個操作有了立即的反應。當你開啟瀏覽器,你會發現所有的帖子都不見了!這是因為我們一直依賴於 autopublish 來讓我們的客戶端可以映象般地得到資料庫中的所有帖子。

最終我們需要做得到我們僅僅把我們客戶端需要看到的帖子傳輸過來(需要考慮分頁的情況)。不過暫時我們可以先設定把 Posts 所有帖子都發布出來。

為達到這個目的,我們建立一個簡單的 Publish() 函式,它僅僅返回一個反映所有帖子的遊標。

Meteor.publish('posts', function() { return Posts.find(); });

在客戶端我們需要訂閱這個釋出。我們僅僅需要增加這樣一行到 main.js 檔案中:

Meteor.subscribe('posts');

集合資料的增刪改查

集合的建立

Post = new Mongo.Collection('post');

資料的增加

Post.insert(myData);

資料的查詢

全部查詢

var findCol = Posts.find().fetch();

按照需求查詢

var a = Posts.find({'titl1':'大熊'}).fetch();

按照id查詢

var myId = a[0]._id;

按條件查詢單個數據

var f = Post.findOne({'title':'baidu'});

在 Meteor 中,find() 返回值是一個遊標。遊標是一種從動資料來源。如果你想輸出內容,你可以對遊標使用 fetch() 來把遊標轉換成陣列。

Meteor 十分智慧地在應用中保持遊標狀態而避免動不動就把遊標變成陣列。這就造成了你不會經常在 Meteor 程式碼中看到 fetch() 被呼叫。

修改資料

var updata = {

titl1:'火影',

titl2:'鳴人',

titl3:'卡卡西'

}

Posts.update(myId,updata);

刪除資料

Posts.remove(myId);

可以使用刪除特定ID的方法刪除資料