【问题标题】:How to update sub field of document?如何更新文档的子字段?
【发布时间】:2015-04-12 12:25:03
【问题描述】:

我有一个名为“Companies”的 Mongo 集合。这是一个示例条目:

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

公司的标签保存在一个对象数组中,其中每个标签都有一个计数属性,该属性会记住标签被点击的频率。当用户点击标签时,我想增加计数。我在事件处理函数中执行此操作。我试图实现这一目标的方式:

第 1 步:找到相关的公司文件。该标记是容器 div 内列表元素内的“a href 元素”。在那个 div 里面我可以找到公司的名字,所以我用那个名字来获取相关的文件:

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

这可行,但我想有一个更清洁的解决方案;我不喜欢 children[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>

【问题讨论】:

标签: mongodb meteor data-modeling


【解决方案1】:

在 html 中为每个标签添加一个唯一的 id,以便 id 显示公司名称和标签名称。

您的标签名称中不应包含空格,称它们为 Tag1、Tag2,而不是 Tag 1、Tag 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' 字段更新计数

【讨论】:

  • 谢谢。正如其他人所提到的,这会引发错误: METEOR: UNCAUGHT ERROR: NOT PERMITTED。不受信任的代码只能按 ID 更新文档。即使选择器包含公司的 ID,它也不起作用,因为它不能包含除 id 之外的任何其他内容。作为一种解决方法,我必须替换整个标签数组。
【解决方案2】:

要更新标签计数,应该可以这样:

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

一般来说,尽量使用现有的包。看看tags packages,主要是patrickleet:tags,并使用带有autoform 的标签。否则,你就在正确的轨道上embedding tags

【讨论】:

  • 谢谢,但这不起作用,它会引发错误:METEOR: UNCAUGHT ERROR: NOT PERMITTED。不受信任的代码只能按 ID 更新文档。作为一种解决方法,我必须替换整个标签数组(并在纯 javascript 中执行实际计数增量)
  • @Pueggel:我怀疑这可能是 Minimongo 的错误。这是issue I filed
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2015-06-22
  • 2012-03-05
  • 2021-12-19
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多