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

How can I add/remove user specific data in Meteor

本文关键字:用户 删除 数据 添加 Meteor      更新时间:2023-09-26

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

在Mongo中,用户数据存储在:Meteor

  / Collections
    / users
      / _id
        / profile
        / services

我应该添加一个新的集合吗?通过以下方式:

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

我应该如何发布用户的私人数据并操作这些集合,以确保它被保存,并且其他人不会修改或访问他人的私人数据。

您可以将数据添加到用户配置文件字段中,如下所示:

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

要只发布特定的字段,可以这样做:

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

希望这能有所帮助。

规范化

"数据库规范化是组织关系数据库的属性和表以最大限度地减少数据冗余的过程。"

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

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

赞成反规范化

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

反规范化

  • 对于像user.messages这样的东西,它的伸缩性不好(你不能只是发布一些消息)

在你的情况下,我肯定会选择eventsfriendsmessages的单独集合。设置无法无限扩展。所以我会把它放进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
  }
})

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