2015-09-30 27 views
2

截至目前,我在\​​服務器我MongoDB的「選擇」 \ publications.js,如:應該發佈MongoDB插入/更新/ Upserts /刪除嗎?

Meteor.publish("jobLocations", function() { 
    return JobLocations.find(); 
}); 

...和我訂閱那些\客戶端\ main.js,如:

Meteor.startup(function() { 
    Meteor.subscribe("jobLocations"); 
. . . 

...但我有我的插入/更新/ Upserts /刪除在\既\ methods.js,就像這樣:

Meteor.methods({ 
    'insertJobLocation': function(username, jobLoc, placename, st8OrProvince, postalcode, xcoord, ycoord) { 
     JobLocations.insert({ 
      jl_jobloc: jobLoc, 
    . . . 

...和我從\客戶打電話給他們\ templates \ whatever.js,如下所示:

'submit form': function(event, template) { 
    . . .  
    Meteor.call('insertJobLocation', jobloc, placename, st8OrProvince, 
     postalcode, xcoord, ycoord, function(err) { 
     . . . 

這是有效的,但它是錯誤的[-headed]?

應該所有 MongoDB的代碼發佈/訂閱(IOW,位於\服務器\ publications.js和\客戶\ main.js?

+1

只訂閱你真正需要的東西。 'Meteor.methods'最終在服務器上執行,您只需發送一個'_id'來真正知道要修改什麼。 –

+0

你是什麼意思?我真的需要一切。 –

回答

1

從我讀過,拇指法則。是訂閱你需要顯示在客戶端瀏覽器上什麼
這將返回所有項目/的JobLocations收藏領域,因此,如果此集合是大,你可能要限制你queryfield PARAMS發佈的內容:

之前:

Meteor.publish("jobLocations", function() { 
    return JobLocations.find(); 
}); 

一旦你得到大量的數據(或要隱藏的敏感數據!):

Meteor.publish("jobLocations", function (jobLocParam) { 
    var selector = { 
    jobLoc: {$in: jobLocParam}, 
    } 
    var options = { 
    sort: {placename: 1}, 
    fields: {jobLoc: 1, placename: 1}, 
    limit: 20 
    } 
    return JobLocations.find(selector, options); 
}); 

所有這些領域都是可選的,但我想我給你舉幾個例子。 selector如果您想要返回所有內容,則可以僅爲{},並且您可以限制使用fields參數(也可選)發佈哪些字段。出版物也可以帶參數,所以如果您願意,可以在創建模板時通過發佈將jobLoc或其數組傳遞給出版物。

希望這會有所幫助!

+0

所以說「訂閱你需要在客戶端上顯示的內容」是否意味着「選擇」(查找),而不是更新,刪除(刪除),Upserts和插入?順便說一句,這是你給出的一個很好的例子;正是博士訂購的... Posthole挖掘機,就是。 –

+1

訂閱僅與讀取數據(查找)相關。所有其他CRUD操作(創建,更新,刪除)都在服務器上處理,但可以通過方法公開。如果你想從客戶端更新一個特定的'jobLoc',你需要訂閱'_id',這樣你就可以告訴服務器哪個文件要更新。 – pingo

+1

將CRUD方法暴露給客戶端時,您應該注意安全,您不希望任何人都能夠從客戶端更新/刪除/插入文檔。沒有[this](https://github.com/ongoworks/meteor-security/)之類的東西,我可以打開chrome js控制檯並對數據進行更改 – pingo