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

标签 mongodb collections meteor publish-subscribe meteor-accounts

我已经尝试过寻找答案,但似乎无法正常工作。我正在使用 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 , thisthis ,但似乎仍然无法让它工作! :-(

提前致谢!

最佳答案

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

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/

相关文章:

javascript - 按照说明操作后,MongoDB 将无法连接到 C9

mongodb - Docker +主管:如何初始化服务(mongo&elasticmq)?

javascript - Meteor:检查有多少客户订阅了某个发布功能

javascript - 在多个模板中的 DOM 元素上初始化 jquery 插件的最佳方法

c# - Mongodb 无法插入我的所有记录

node.js - Mongoose 错误 : nesting Schemas

hibernate - 如何配置 Element-collection 以映射 JPA orm.xml 配置中的现有数据库表?

c# - 合并两个 Collection<T>

java - 如何迭代列表以仅获取特定属性

javascript - meteor 动画