Передача данных между двумя коллекциями — Meteor JS

Пример

У меня есть две коллекции, одна для сообщений и одна для ярлыков, которые выглядят так:

Post {
   "_id": "WZTEGgknysdfXcQBi",
   "title": "ASD",
   "labels": {},
   "author": "TMviRL8otm3ZsddSt",
   "createdAt": "2016-01-14T08:42:42.343Z",
   "date": "2016-01-14T08:42:42.343Z"
}

Label {
   "_id": "9NCNPGH8F5MWNzjkA",
   "color": "#333",
   "name": "Grey Label",
   "author": "TMviRL8otm3ZsddSt"
}

Чего я хочу добиться, так это иметь сообщения с несколькими ярлыками.

Проблема в том, что я не могу вставить данные ярлыка в сообщение. У меня есть шаблон для добавления нового поста, и я повторяю там ярлыки. Затем в помощниках я проверяю, какая метка отмечена, и сохраняю ее в массив, но я не могу вставить этот массив в коллекцию сообщений.

'submit .add-entry': function(event) {
    var title = event.target.title.value;
    var description = event.target.description.value;

    var checkedLabels = $('.label-checkbox:checked');

    //initiate empty array
    var labelsArray = [];

    //go over the checked labels
    for(i = 0; i < checkedLabels.length; i++){
        var label = checkedLabels[i].value;

        // store ids into array
        labelsArray.push(label)
    };

    Posts.insert({
        title: title,
        description: description,
        labels: labelsArray
    });

Вопрос 1. Должен ли я вставлять все данные тегов или только идентификатор извлекает дополнительные сведения из коллекции тегов на основе этого идентификатора?

Вопрос 2. Как вставить этот массив ярлыков в сообщение? Приведенный выше код не работает, потому что ему нужен объект

Q3 Как лучше всего добиться такой связи между коллекциями?


person Skkyp    schedule 14.01.2016    source источник


Ответы (2)


(Q1) Вы можете вставить все идентификаторы тегов в этот список labels и обновлять его (Q3) Я думаю, что это хорошая практика; в процессе разработки попробуйте опубликовать составные коллекции с помощью этого пакета: https://github.com/englue/meteor-publish-composite

(Q2) Вставить легко:

Post.insert({title:'Abc', labels:['one', 'two']});

Вам нужно будет использовать $addToSet для обновления. Вот пример возможного метода:

let setModifier = {
  $addToSet: {
    labels: myArrayOfLabelIDs
  }
};
return Post.update({
  _id: id
}, setModifier);

Примечание. Никогда не используйте вставки в клиенте (как это делали вы). Мой пример может быть добавлен как метод на сервере (используйте check() внутри него) и может быть вызван из клиента при отправке, например:

Meteor.call('myMethod', id, labelsArray)
person Radu Chiriac    schedule 14.01.2016
comment
Спасибо за ответ, но он не работает. Я пытаюсь сделать вставку следующим образом: Posts.insert({ title: title, description: description, labels: labelsArray }); Я не мог сделать это ни так, ни с опцией addToSet... Также все работает нормально, если я отправляю один идентификатор в виде строки. - person Skkyp; 14.01.2016
comment
Можете ли вы вставить ошибку, которую вы получаете? Попробуйте сделать это в meteor shell: Post.insert({title:'Abc', labels:['one', 'two']}); - person Radu Chiriac; 14.01.2016

Q1: Должен ли я вставлять все данные тегов или только идентификатор извлекает дополнительные сведения из коллекции тегов на основе этого идентификатора?

Это зависит: меняется ли этикетка? Если он изменчив, то лучше хранить только идентификатор, чтобы при извлечении метки по идентификатору всегда возвращались правильные данные. В противном случае вам необходимо обновить каждое сообщение с новой информацией о ярлыке.

Q2: Как я могу вставить этот массив меток в сообщение? Приведенный выше код не работает, потому что ему нужен объект

Если код не работает, вероятно, вы используете какую-то несоответствующую схему: чтобы вставить массив вместо объекта, вам нужно изменить схему, чтобы она принимала массив. Вы не опубликовали детали схемы.

Q3 Каков наилучший способ добиться такой связи между коллекциями?

Вы должны взглянуть на «денормализация»: это термин, используемый для такого рода вещей в базе данных NoSQL, такой как MongoDB. Прямого ответа нет, это зависит от отношения (1-1, 1-многие, многие-1) и соотношения каждого «много»: в некоторых случаях лучше всего вкладывать данные в объекты, если они неизменяемы или если иметь дело с обновлениями не так уж и сложно.

эта серия сообщений в блоге должна помочь вам лучше понять: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1

person MrE    schedule 14.01.2016