用户收集附加字段

时间:2014-05-12 12:00:19

标签: javascript mongodb meteor

我需要在流星的用户集合中添加一个额外的字段。所以我正在做的是在下面的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,仍然无效。那么,谁知道应该做什么?我很无能。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

发布很好。

我用你的代码片段创建了一个项目,我看到了用户客户端通知的价值。我怀疑你实际上并没有更新用户。你想确保你在服务器端做这件事。

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

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 } } );
});

如果您想要通知所有用户(您可能希望通过{notifications:0}来选择效率)。这也简单地通知:1而不是[1]