我已经尝试过寻找答案,但似乎无法正常工作。我正在使用 Meteor 和 Cordova 来构建一个移动应用程序。
我想向我的用户集合添加一个属性(我登录时创建的一个 meteor )。 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 ,但似乎仍然无法让它工作! :-(
提前致谢!
最佳答案
您不应该更改用户对象的根字段:
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 年了 :) 事实证明,强制在“个人资料”字段下写入特定于用户的字段作为一些严重的安全隐患(就像我一直认为的那样),因为它允许客户修改这些子字段。所以是的,您可以在根对象中设置字段,但请注意,不应由客户端修改的字段应位于没有写入权限的字段下(否则会出现同样的问题)。
关于mongodb - Meteor:我应该如何更新用户集合以在对象/字典中包含一个新属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29835663/