2015-02-11 75 views
1

編輯的文檔的子領域:解決方案可以在評論的MongoDB:如何更新(流星)

細心發現:noob問題在未來

我有一個蒙戈集合稱爲「公司」。下面是一個例子條目:

{ 
    name: 'Company 1', 
    createdAt: new Date(), 
    tags: [ 
      {tag: 'tag 1', count: 63}, 
      {tag: 'tag 2', count: 47}, 
      {tag: 'tag 3', count: 13} 
     ] 
} 

正如在本例中可以看出,公司的標籤都保存在對象的數組,每個標籤具有記憶標籤被點擊的頻率計數屬性。

現在,我想在用戶點擊標籤時增加計數。我在事件處理函數中這樣做。我試圖做到這一點的方式如下:

第1步:我必須找到相關的公司文件。標籤是container-div中的list元素中的「href元素」。裏面該div,我能找到該公司的名稱,所以我用這個名字來獲得相關文件:

var companyName = event.target.parentElement.parentElement.children[1].textContent; 
var company = Companies.findOne({name: companyName}); 

到目前爲止是這種情況,但我想,有一個清晰的解決方案。我特別不喜歡孩子[1]的一部分。任何建議?

第2步:現在我有公司,我想增加被點擊的標籤。這有點令人討厭,因爲我需要選擇數組的正確元素進行更新。我有我想要更新的標籤的文本(來自event.target.text),但是如何從標籤數組中選擇正確的對象?我認爲這與位置$操作符有關,但我還不知道。

Companies.update({_id: company._id, }, /* MAGIC HAPPENS HERE */); 

這裏的HTML:

<head> 
    <title>App</title> 
</head> 

<body> 
    <div class="container"> 
     {{> company}} 
    </div> 
</body> 

<template name="company"> 
    <h2>{{name}}</h2> 
    {{#each tags}} 
     {{> tag}} 
    {{/each}} 
</template> 

<template name="tag"> 
    <li><a href="">{{tag}}</a> - {{count}}</li> 
</template> 
+0

請包括html代碼以及 – mwarren 2015-02-11 23:06:10

+0

完成。添加了html。 – Pueggel 2015-02-11 23:16:38

+0

看看[標籤包](https://atmospherejs.com/?q=tags),主要是'patrickleet:tags'和使用'autoform'標籤。否則,你在正確的軌道上[嵌入標籤](https://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo)。 – 2015-02-11 23:44:49

回答

2

在HTML中添加一個唯一的ID每個標籤,這樣的ID都顯示公司名稱和標記名稱。

您的標籤名稱中不應包含空格,請將它們稱爲Tag1,Tag2,而不是標籤1,標籤2。對於公司名稱,空格總是有問題。使用帶有下劃線的'Company_Name',如果需要,可以稍後移除。

因此,每個標籤應該有一個唯一的ID是這樣的:

<a href="" id="Company_Name.tag1">{{tag}}</a> 

然後你可以從該事件被點擊鏈接的ID,並拆分上點的ID透露雙方公司名稱和標籤名稱。


然後更新計數:

Company.update({"name" : "Company 1", 'tags.tag': 'tag 1'}, {$inc: {'tags.$.count': 1}}); 

如果流星沒有讓你這樣做,那麼你可以: 把_id字段在HTML,而不是公司名稱,

或: 1)您使用公司名稱 查找記錄2)從記錄中獲取_id 3)然後使用_id而不是'name'字段更新計數

+0

謝謝。我可以使用它來更快地找到標籤和公司。但它不能解決重要問題:更新計數字段。 – Pueggel 2015-02-12 10:43:06

+0

我已經更新了我的答案,它顯示瞭如何更新計數字段 – mwarren 2015-02-12 15:10:58

+0

謝謝。正如其他人所提到的,這會產生一個錯誤:METEOR:UNCAUGHT ERROR:NOT PERMITTED。不受約束的代碼可能只能通過ID更新文檔。即使選擇器包含公司ID也不起作用,因爲它不能包含任何其他內容。作爲一種解決方法,我必須替換整個標籤數組。 – Pueggel 2015-02-12 15:14:18

1

要更新標籤數,這樣的事情應該工作:

Company.update({_id: company._id, tags.tag: tagName}, {$inc: {tags.$.count: 1}}); 

一般情況下,儘量使用現有的包。看看tags packages,主要是patrickleet:tags和使用autoform標籤。否則,你在正確的軌道embedding tags

+0

謝謝,但這不起作用,它會產生一個錯誤:METEOR:UNCAUGHT ERROR:NOT PERMITTED。不受約束的代碼可能只能通過ID更新文檔。作爲一種解決方法,我必須替換整個標籤數組(並在普通javascript中做實際的計數增量) – Pueggel 2015-02-12 10:55:53

+0

@Pueggel:我懷疑這可能是Minimongo的一個錯誤。這是[我提交的問題](https://github.com/meteor/meteor/issues/3775)。 – 2015-02-20 09:43:18