2015-05-09 33 views
1

Happy Friday!Meteor.js:使用Collection來存儲該集合的狀態

我對這裏的社區有點新手問題,找不到以前的答案。我沒有足夠的代碼來創建一個包,但我想在我的集合中存儲一些輔助方法,這些輔助方法可以在任何地方重複使用,並且還可以重用「Words」集合名稱空間。我將客戶端存儲在我的lib文件夾中。當我這樣做時,我對Mongo DB做了什麼奇怪的事情?根據我的理解,Words初始化Mongo集合,但實際變量只是一個常規的JS變量,您可以添加方法和屬性 - Mongo方面只能通過.find(),.insert()訪問,等等方法。這是否準確?一般來說,這通常是一種很好的做法?

Words = new Mongo.Collection ('words'); 
Words.state = {}; 

Words.state.shuffle = function () { 
    return _.shuffle(Words.find().fetch()); 
}; 
//find id of current set 

Words.state.indexOf = function (id) { 
    var i; 
    var arr = Words.state.currentSet; 
    for (i = 0; i < arr.length ; i++) { 
     if (arr[i]._id === id) return i; 
    } 
}; 
+0

我看不出什麼毛病,如果這就是你想要做什麼。但是,我不認爲這是一個問題的計算器。你的問題沒有正確或錯誤的答案。這主要是意見。 –

回答

3

當我這樣做時,我對Mongo DB做了什麼奇怪的事情嗎? findinsertremoveupdate等。因此,你可以自由地修改集合:

號流星通過一個低級別的MongoDB的驅動程序,這是從內在到所有collections功能只調用蒙戈通信沒有恐懼的情況下,只要你沒有取代任何上述功能。

一般來說,這是一個很好的做法?

這是一個意見問題,但我認爲是。我喜歡爲收集實例和轉換後的文檔添加函數。例如:

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

Posts.fetchByAuthor = function(userId) { 
    if (userId == null) 
    userId = Meteor.userId(); 

    return Posts.find({authorId: userId}).fetch(); 
}; 

現在,在您的應用程序的任何地方,你可以叫Posts.fetchByAuthor()由作者來獲得職位名單,而不需要知道收集數據是如何引擎蓋下儲存。

如果您需要文檔實例(而不是整個集合)的額外功能,我建議使用collection helpers。例如:

Posts.helpers({ 
    author: function() { 
    return Meteor.users.findOne(this.authorId); 
    } 
}); 

現在,我們可以在任何地方在我們的應用程序調用post.author()讓筆者對於特定職位。同樣,我們可以調用該函數,而無需知道作者在文檔中的存儲方式。

雖然這些示例很簡單,但集中您的模型層邏輯的技術是極其強大的,因爲它有助於區分應用程序的問題。在較大的項目中,我們發現這極大地簡化了我們的工作,特別是在編寫模板代碼時。

推薦閱讀:How to add a model layer to your app

0

流星社區包是瞭解如何擴展Mongo Collections的最佳資源。我最喜歡的一個是collection-hooks,但還有其他像aldeed:collection2,強制您的插入和更新操作符合包aldeed:simple-schema提供的架構。

您還應該使用Javascript來擴展對象,您將會理解該包的代碼。檢查jQuery和/或Underscore.js方法,你會發現相關的方法,讓你在這個問題上更輕鬆。