2015-02-11 76 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