【问题标题】:Users collection additional field用户集合附加字段
【发布时间】:2014-05-13 01:57:05
【问题描述】:

我需要在流星的用户集合中添加一个附加字段。所以我正在做的是在下面的 server.js 文件中添加以下代码。

//server.js

Meteor.publish("users", function () {
  if (this.userId) {
    return Meteor.users.find({_id: this.userId},
        {fields: {'notified': 1}});
  } else {
    this.ready();
  }
});

client.js如下:

// client.js
Deps.autorun(function() {
    Meteor.subscribe('users');
});

为了在新用户登录时添加字段,fixture.js 如下:

// fixture.js
Accounts.onCreateUser(function (options, user) {
    if (options.profile) {
        user.profile = options.profile;
        user.profile.notified = false;
    }
    return user;
});

在代码中,我正在像这样更新通知字段

// inside a loop taking all the users of the collection
// where myUsers is the loop index.
Meteor.users.update(myUsers._id, {$addToSet: {notified : 1}});

但令我惊讶的是,当我通过 mongo 控制台或浏览器控制台检查该字段是否已添加到集合中时,它没有显示出来。为什么这样?。我已经阅读了网上几乎所有可用的文章并关注了http://docs.meteor.com/#meteor_users,但仍然无法正常工作。那么,有谁知道应该怎么做?我一无所知。

【问题讨论】:

  • Meteor.users.update(myUsers._id, {$addToSet: {notified : 1}}); 更新发生在服务器还是客户端?

标签: javascript mongodb meteor


【解决方案1】:

发布很好。

我使用您的 sn-ps 创建了一个项目,我看到 notify 对用户客户端的价值。我怀疑您实际上并没有更新用户。你要确保你是在服务器端做的。

正如休伯特所说,您想确定通知字段的位置。无论是在用户的基础上还是在个人资料部分,要记住的是,如果它在个人资料部分,用户可以编辑他们自己的个人资料部分:

Meteor.users.update( Meteor.user()._id, { $set: { 'profile.notified': 1 } } );

检查已登录用户服务器端的所有字段,以确保通过添加此服务器端获得通知值:

Meteor.methods({
  user: function() {
    console.log(Meteor.users.findOne(this.userId));
  }
});

然后输入 Meteor.call('user');在你的 js 控制台中。在终端窗口中查找结果。

还有你的线

Meteor.users.update(myUsers._id, {$addToSet: {notified : 1}});

会导致被通知:

notified: [ 1 ]

即addToSet 正在创建一个不存在的数组,然后将值 1 添加到其中。

我还会检查您的循环代码。 myUsers 是循环索引吗?不应该是循环中的用户对象吗?

我希望有更多类似的东西:

Meteor.users.find().forEach(function (user) {
  Meteor.users.update( user._id, { $set: { notified: 1 } } );
});

如果您想让所有用户都得到通知(不过,您可能希望通过 {notified: 0} 进行选择以提高效率)。这也简单地使 notify: 1 而不是 [1]

【讨论】:

  • 嗨,我做了你告诉的所有更改......所以控制台上的输出是“ { createdAt: Tue May 13 2014 10:56:45 GMT+0100 (BST ),_id:'dHKSZnqNApyPia9xn',服务:{密码:{srp:[Object]},简历:{loginTokens:[Object]}},用户名:'ajay',电子邮件:[{地址:'ajay@gmail.com ',已验证:false } ] }" ..... 另外,我想检查所有在应用程序中已经拥有帐户的用户,但是当我按照上面的方式运行循环时,它只提供当前登录用户的信息。为什么会这样以及应该做些什么来获取所有用户的信息。
  • 你需要做 Meteor.users.find().forEach() 服务端获取所有用户。默认情况下,客户端上的用户只能看到自己。通过运行我上面给出的循环,您将在用户对象的基础中获得通知字段,即 { createdAt: "", _id: "", notify: 1, emails: [{...}]} 而不是 in个人资料部分。我相信默认情况下,帐户密码系统不使用个人资料部分,而不是 facebook、github 等 oauth 流。如果你想在个人资料部分做 $set: { 'profile.notified': 1 }.
  • 感谢@boingy,它成功了。你能帮我解决这个问题吗? "stackoverflow.com/questions/23108369/…"
【解决方案2】:

您没有写信给user.notified,而是写给user.profile.notified。这是两个不同的领域!

【讨论】:

  • 我也试过了,还是不行……有什么我遗漏的吗?请告诉我
猜你喜欢
  • 2016-05-08
  • 2019-05-16
  • 2020-01-17
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多