Как добавить/удалить пользовательские данные в Meteor

Несколько вопросов о хранении пользовательских данных в MongoDB. Какое лучшее место в монго для хранения данных пользователя, таких как настройки пользователя, URL-адрес фотографии пользователя, друзья пользователя, события пользователя?

В Mongo пользовательские данные хранятся в: Meteor

  / Collections
    / users
      / _id
        / profile
        / services

Должен ли я добавлять туда новые коллекции? Следующим образом:

        / events / _id's
        / friends / _id's
        / messages / _id's
        / settings

Как я должен публиковать личные данные пользователя и манипулировать этими коллекциями, чтобы быть уверенным, что они сохранены, и никто другой не будет изменять или иметь доступ к личным данным другого человека.


person Dariusz Sikorski    schedule 22.06.2015    source источник


Ответы (2)


Вы можете добавить данные в поле профиля пользователя следующим образом:

Meteor.users.update( id, { $set: { 'profile.friends': someValue } } );

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

Meteor.publish( 'users', function () {
    return Meteor.users.find( {}, { fields: { 'profile.friends': 1 } } );
});

Надеюсь это поможет.

person Ashmore11    schedule 23.06.2015
comment
Заменил Meteor.users.find( {},... на Meteor.users.find( {_id: this.userId},..., чтобы получать только мои личные данные. Хм, когда база данных достигнет 10 000 пользователей, я думаю, это может убить сервер, если каждый пользователь получит 10 000 списков друзей. - person Dariusz Sikorski; 23.06.2015

Нормализация

"Нормализация базы данных — это процесс организации атрибутов и таблиц реляционной базы данных для минимизации избыточности данных."

MongoDB — нереляционная база данных. Это затрудняет запрос нормализованных данных. Вот почему в MongoDB мы денормализуем данные. Это упрощает запрос.

Это зависит от вашего варианта использования. Вопрос в основном в том, когда проводить деформализацию. В основном это вопрос мнения. Но объективно есть некоторые плюсы и минусы:

Плюсы деморализации

  • Легче извлекать данные (из-за того, что Mongo не является реляционной БД)
  • Он работает лучше, если вы всегда получаете данные в большом количестве.

Минусы деморализации

  • Он плохо масштабируется для таких вещей, как user.messages (вы не можете просто публиковать некоторые сообщения).

В вашем случае я бы определенно выбрал отдельные коллекции для events, friends и messages. Параметр не может расширяться бесконечно. Так что я бы поместил его в коллекцию users.

Безопасность

Я бы использовал публикации и разрешал и запрещал для этого. Позвольте мне сделать пример для Messages:

Коллекция

Messages = new Mongo.Collection('Messages')

Messages.insert({
  sender: Meteor.userId,
  recipient: Meteor.users.findOne()._id,
  message: 'Hello world!'
})

Публикация

Meteor.publish('userMessages', function (limit) {
  return Messages.subscribe({
    $or: [
      {sender: this.userId},
      {recipient: this.userId}
    ]
  }, {limit: limit})
})

Разрешить

function ownsMessage (user, msg) {
  return msg.sender === user ? true : false
}

Messages.allow({
  insert: function (userId, newDoc) {
    !!userId
  },
  update: function (userId, oldDoc, newDoc) {
    if(
      ownsMessage(userId, oldDoc) &&
      ownsMessage(userId, newDoc)
    ) return true
    return false
  },
  remove: function () {
    return false
  }
})

Этот код не тестировался, поэтому он может содержать небольшие ошибки

person halbgut    schedule 23.06.2015
comment
Хорошо, после прочтения предложений, вот что я понял: деформализация связана с публикацией всей коллекции некоторых данных, нормализация связана с публикацией только части коллекции. И для нормализованных сообщений вы использовали subscribe (для сообщений userId) вместо find, затем установите правила разрешения, только если пользователь ownsMessage. - person Dariusz Sikorski; 23.06.2015
comment
Я добавил объяснение денормализации поверх своего ответа. Ваше понимание этого немного не так. Извините за путаницу, я думал, вы знаете, что это было. Информацию о подписке и поиске можно найти в официальной документации. Я также добавил ссылки на соответствующие места документов в своем ответе. Если после этого у вас останутся вопросы, буду рад помочь. :) - person halbgut; 23.06.2015