Meteor:我应该如何更新用户集合以在对象/字典中包含一个新属性?

Posted

技术标签:

【中文标题】Meteor:我应该如何更新用户集合以在对象/字典中包含一个新属性?【英文标题】:Meteor: How should I update the Users collection to include a new attribute in the object / dictionary? 【发布时间】:2015-07-02 08:38:09 【问题描述】:

我已经尝试过寻找答案,但似乎无法正常工作。我正在使用 Meteor 和 Cordova 来构建一个移动应用程序。

我想向我的用户集合添加一个属性(我登录时创建的一个流星)。 IE。例如,我想将 currentHotel: "Something" 添加到我的 db.Users 集合中。

我正在尝试以正确的发布 - 订阅方式执行此操作。使用 Meteor.methods 被引用为不适合实时应用程序。无论哪种方式,我都想了解如何使用发布 - 订阅更新用户集合。

//On the server, I did
Meteor.publish("userData", function () 
    return Meteor.users.find(_id: this.userId,
       fields:services: 1, currentHotel: 1);
);

因此,客户端应该可以访问 currentHotel 字段。现在更新“currentHotel”字段:

//On the client I do
Meteor.subscribe('userData');
var user = Meteor.users.findOne("_id": Meteor.userId());
Meteor.users.update(_id: user._id, $set:currentHotel:'something');

//I tried this too
//Meteor.users.update( _id: Meteor.userId() , $set: );

在浏览器控制台上,我可以看到“currentHotel”和“services”,这意味着发布-订阅工作正常。然而,我似乎无法更新 currentHotel。我收到拒绝访问。这是为什么呢?

此外,如果集合中根本不存在“currentHotel”属性,我如何使用类似的发布-订阅来添加它?我可以发布不存在的属性并允许客户端订阅和添加该属性吗?

我参考了 Meteor 文档,this、this 和 this,但似乎仍然无法正常工作! :-(

提前致谢!

【问题讨论】:

【参考方案1】:

您不应该更改用户对象的根字段:

Meteor.users.update(user, $set: "profile.currentHotel": "something");

在此处阅读更多信息:http://docs.meteor.com/#/full/meteor_users

编辑:此答案已变得无关紧要,如最新文档所示:https://guide.meteor.com/accounts.html#dont-use-profile

这个答案已经超过 1 年了 :) 事实证明,强制在“个人资料”字段下写入特定于用户的字段作为一些严重的安全隐患(就像我一直认为的那样),因为它允许客户修改这些子字段。所以是的,您可以在根对象中设置字段,但请注意,不应由客户端修改的字段应位于没有写入权限的字段下(否则会出现同样的问题)。

【讨论】:

你是最棒的!谢谢!我假设我不需要发布任何内容来添加到此配置文件对象?编辑:啊,个人资料是自动发布的!非常感谢! 谢谢,这对我也很有用。请注意,我尝试以这种方式更新时出错,我必须按照建议的in this other question 用 _id: Meteor.userId() 指示_id。 @JoséRicardoRibeiro 您链接到的文档页面目前没有提到任何关于不向用户对象添加根字段的内容(我可以找到)。 guide.meteor.com/accounts.html#top-level-fields 说最好的方法就是这样做。哪个是正确的? @mpdonadio 这个答案已经超过 1 年了 :) 是的,事实证明,作为一些严重的安全隐患,强制在“个人资料”字段下写入特定于用户的字段(就像我总是思想),因为它允许客户端修改这些子字段。 guide.meteor.com/accounts.html#dont-use-profile 所以是的,您可以在根对象中设置字段,但请注意,不应由客户端修改的字段应位于没有写入权限的字段下。

以上是关于Meteor:我应该如何更新用户集合以在对象/字典中包含一个新属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新meteor.js中的Mongodb集合?

插入新对象时 Meteor 0.8.2 客户端集合为空

如何部分更新meteor.users.profile?

Meteor,如何使用乐观的 UI 更新集合

Meteor CollectionFS:如何防止重复文件?

Mongo - 从对象更新集合的每个文档