2015-02-11 3 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: Мне нужно найти соответствующий документ компании. Тег является «элементом href» внутри элемента списка внутри контейнера-div. Внутри этого DIV, я могу найти название компании, поэтому я использую это имя, чтобы получить соответствующий документ:

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

Это работает до сих пор, но я полагаю, что есть чистое решение. Мне особенно не нравятся дети [1]. Любые рекомендации?

Шаг 2: Теперь, когда у меня есть компания, я хотел бы увеличить метку, которая была нажата. И это отвратительно, потому что мне нужно выбрать правильный элемент массива для обновления. У меня есть текст тега, который я хочу обновить (из event.target.text), но как выбрать правильный объект из массива tags? Я думаю, что это имеет какое-то отношение к оператору positional $, но я этого еще не понимаю.

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

+0

. добавлен html. – Pueggel

+0

Посмотрите на [tags packages] (https://atmospherejs.com/?q=tags), в основном 'patrickleet: tags' и используя теги с' autoform'. В противном случае вы на правильном пути [встраиваете теги] (https://stackoverflow.com/questions/8455685/how-to-implement-post-tags-in-mongo). –

ответ

2

В HTML добавить уникальный идентификатор для каждого тега, так что идентификатор показывает, как название компании и имя тега.

В названиях ваших тегов не должно быть пробелов, назовите их Tag1, Tag2, а не тег 1, тег 2. То же самое для названия компании, пробелы всегда являются проблемой. Используйте «Company_Name» с подчеркиванием, которое вы можете удалить позже, если потребуется.

Таким образом, каждый тег должен иметь уникальный идентификатор что-то вроде этого:

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

Тогда вы можете получить идентификатор щелкнули ссылку от события, и разделить идентификатор на точку, чтобы показать как название компании и имя тега.


Затем обновить количество:

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

Если Meteor не позволит вам сделать это, то вы либо: поместить поле _id в вашем HTML вместо названия компании,

или: 1) вы сделаете поиск для записи с использованием названия компании 2) получите _id из записи 3), затем обновите счет, используя _id вместо поля 'name'

+0

Спасибо. Я могу использовать это, чтобы быстрее найти тег и компанию. Но это не решает важной проблемы: обновите поле счетчика. – Pueggel

+0

Я обновил свой ответ, в котором показано, как обновить поле count – mwarren

+0

Спасибо. Как упоминалось другими, это вызывает ошибку: МЕТЕОР: ОШИБКА НЕПРЕРЫВНОСТИ: НЕ РАЗРЕШЕНО. НЕОБХОДИМЫЙ КОД МОЖЕТ ТОЛЬКО ОБНОВЛЯТЬ ДОКУМЕНТЫ по ID. Даже если селектор включает идентификатор компании, он не работает, потому что он не должен содержать ничего, кроме идентификатора. В качестве обходного пути я должен заменить весь массив тегов. – Pueggel

1

Чтобы обновить количество тегов, что-то, как это должно работать:

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

Как правило, пытаются использовать существующие пакеты. Посмотрите на tags packages, в основном patrickleet:tags и используя теги у autoform. В противном случае вы на правильном пути embedding tags.

+0

Спасибо, но это не работает, оно вызывает ошибку: METEOR: UNAUGHT ERROR: НЕ РАЗРЕШЕН. НЕОБХОДИМЫЙ КОД МОЖЕТ ТОЛЬКО ОБНОВЛЯТЬ ДОКУМЕНТЫ по ID. Как обходной путь, я должен заменить весь массив тегов (и сделать фактическое увеличение счета в простом javascript) – Pueggel

+0

@Pueggel: Я подозреваю, что это может быть ошибка с Minimongo. Вот [проблема, которую я подал] (https://github.com/meteor/meteor/issues/3775). –

Смежные вопросы