如何在Meteor中添加/删除用户特定数据

时间:2015-06-22 23:13:51

标签: javascript mongodb meteor meteor-accounts

关于在MongoDB中存储用户数据的几个问题。 mongo存储用户特定数据的最佳位置是什么,例如用户设置,用户照片网址,用户朋友,用户事件?

在Mongo中,用户数据存储在: 流星

  / Collections
    / users
      / _id
        / profile
        / services

我应该在那里添加新的收藏品吗?以下列方式:

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

我应该如何发布用户的私人数据并操纵此集合,以确保它是保存的,没有其他人可以修改或访问其他人的私人数据。

2 个答案:

答案 0 :(得分:1)

正常​​化

"Database normalization is the process of organizing the attributes and tables of a relational database to minimize data redundancy."

MongoDB是一个非关系型数据库。这使得规范化数据难以查询。这就是为什么在MongoDB中我们对数据进行非规范化。这使得查询变得更容易。

这取决于您的用例。问题基本上是什么时候去正规化。这主要是一个意见问题。但目标在这里有一些优点和缺点:

非正规化的优点

  • 检索数据更容易(由于Mongo不是关系数据库)
  • 如果您总是批量获取数据,那么效果会更好

对非正规化的缺点

  • user.messages之类的内容不能很好地扩展(你不能只宣传一些消息)

在你的情况下,我绝对会选择eventsfriendsmessages的单独收藏品。设置无法无限扩展 。所以我将它放入users集合中。

安全

我会使用出版物并允许和否认。让我举一个Messages的例子:

Collection

Messages = new Mongo.Collection('Messages')

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

Publication

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

Allow

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
  }
})

此代码未经测试,因此可能包含小错误

答案 1 :(得分:1)

您可以将数据添加到用户个人资料字段,如下所示:

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

要仅发布特定字段,您可以执行以下操作:

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

希望这有帮助。