2012-04-11 35 views

回答

2

從文檔:

  • 在服務器上,與該名稱的集合後端蒙戈服務器上創建的。當您在服務器上調用該集合上的方法時,它們會直接轉換爲正常的Mongo操作。

  • 在客戶端上,創建了一個Minimongo實例。 Minimongo本質上是一個內存中,非持久化的Mongo,在 純JavaScript中。它充當本地緩存,僅存儲該客戶端正在使用的數據庫的子集。 查詢客戶端(查找)直接從此緩存中提供,而不是 與服務器通話。

當您向客戶端上的數據庫(插入,更新,刪除), 命令同時立即執行在客戶端上,並且, ,它運到服務器和太在那裏執行。 livedata包是負責這個。

這也解釋了客戶機到服務器

服務器對客戶從我所知是livedata和蒙戈 - livedata包。

https://github.com/meteor/meteor/tree/master/packages/mongo-livedata

https://github.com/meteor/meteor/tree/master/packages/livedata

希望有所幫助。

+0

我還沒有測試過的一件事是插入到Meteor外部*完成的MongoDB集合是否傳播到客戶端。 – fadedbee 2012-04-20 14:56:56

+0

我已經瀏覽了代碼,但是我看不到MongoDB通知Meteor更新集合的行。 – fadedbee 2012-04-20 14:58:13

+3

@chrisdew我剛剛插入一條記錄直接到MongoDB,它出現在瀏覽器中。所以我猜服務器會收到通知。 – 2012-04-27 17:05:59

19

你想爲此query.observe()。假設您有一個帶有標籤字段的Posts集合,並且您希望在添加具有important標籤的帖子時收到通知。

http://docs.meteor.com/#observe

// collection of posts that includes array of tags 
var Posts = new Meteor.Collection('posts'); 

// DB cursor to find all posts with 'important' in the tags array. 
var cursor = Posts.find({tags: 'important'}); 

// watch the cursor for changes 
var handle = cursor.observe({ 
    added: function (post) { ... }, // run when post is added 
    changed: function (post) { ... } // run when post is changed 
    removed: function (post) { ... } // run when post is removed 
}); 

,如果你想要做的事在每個瀏覽器時後的變化,您可以運行在客戶端上運行此代碼。或者你可以在服務器上運行它,如果你想說當添加一個重要的帖子時發送一封郵件給團隊。

請注意,addedremoved指的是查詢,而不是文檔。如果你有一個現有的職位文檔和運行

Posts.update(my_post_id, {$addToSet: {tags: 'important'}}); 

這將觸發「添加」的回調,因爲職位是被添加到該查詢結果。

+7

這是一個非常好的答案,但不是這個問題。我問的是Meteor如何從MongoDB獲得更改流,而不是如何從Meteor獲取更改。 – fadedbee 2012-04-12 13:19:35

3

目前,流星對於一個實例/過程確實很好。在這種情況下,所有查詢都將通過此實例進行,並可將其廣播回其他客戶端。另外,它每10秒輪詢一次MongoDB,以查看由外部查詢完成的對數據庫的更改。他們計劃使用1.0來提高可伸縮性,並希望允許多個實例通知每個變化。

另一方面,DerbyJS正在使用Redis PubSub。