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

时间:2015-04-23 22:43:38

标签: mongodb collections meteor publish-subscribe meteor-accounts

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

我想在我的Users集合中添加一个属性(Meteor在我登录时创建的属性)。即。例如,我想将{currentHotel:" Something"}添加到我的db.Users集合中。

我试图以正确的发布 - 订阅方式执行此操作。使用Meteor.methods被引用对实时应用程序不利。无论哪种方式,我想了解如何使用Publish - Subscribe。来更新Users集合。

//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"和"服务"很好,这意味着发布 - 订阅工作。但我似乎无法更新currentHotel。我得到一个拒绝访问。这是为什么?

此外,如果" currentHotel" Collection中根本不存在属性,如何使用类似的发布 - 订阅添加它?我是否可以发布不存在的属性并允许客户订阅并添加该属性?

我提到了Meteor文档,thisthisthis,但似乎无法让它发挥作用! : - (

提前致谢!

1 个答案:

答案 0 :(得分:7)

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

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岁:)事实证明,强迫在“个人资料”字段下编写用户特定字段作为一些严重的安全隐患(我一直认为),因为它允许客户端修改这些子字段。所以是的,你可以在根对象中设置字段,但要注意客户端不应该修改的字段应该在没有写权限的字段下(否则它会遇到同样的问题)。