MongoDB:如何更新文档的子字段(Meteor)

时间:2015-02-11 22:50:56

标签: mongodb database-design meteor data-modeling

编辑:可以在评论中找到解决方案

小心:Noob提问。

我有一个名为"公司"的mongo系列。这是一个示例条目:

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

从示例中可以看出,公司的标签保存在一个对象数组中,其中每个标签都有一个count属性,用于记住标签被点击的频率。

现在,我希望在用户点击代码时增加计数。我在事件处理函数中执行此操作。我试图实现这一目标的方式如下:

第1步:我必须找到相关的公司文件。标签是" href元素"在container-div中的list元素内。在该div中,我可以找到公司的名称,因此我使用该名称来获取相关文档:

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

到目前为止这是有效的,但我认为这是一个更清洁的解决方案。我特别不喜欢孩子[1]部分。有什么建议吗?

第2步:现在我有了公司,我想增加点击的标签。这有点令人讨厌,因为我需要选择要更新的数组的正确元素。我有要更新的标签文本(来自event.target.text),但如何从tags-array中选择正确的对象?我认为它与位置$运算符有关,但我还不明白。

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>

2 个答案:

答案 0 :(得分: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}});

如果Meteor不允许你这样做,那么你要么: 将_id字段放在html中而不是公司名称

或: 1)您使用公司名称查找记录 2)从记录中获取_id 3)然后使用_id而不是'name'字段更新计数

答案 1 :(得分:1)

要更新标签计数,这样的事情应该有效:

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

通常,尝试使用现有的包。请查看tags packages,主要是patrickleet:tags并使用autoform标记。否则,您就在正确的轨道上embedding tags