通过Meteor将新对象添加到Mongo文档中的数组

时间:2014-05-27 02:07:50

标签: javascript mongodb meteor

我在Meteor写了一个小规划的扑克工具;第一次使用meteor和json文档商店。我有一个用户故事集,以及分配给该故事的用户和这些用户的评分。

最初,我会做一些这样的插入:

Stories.insert({'story': stories[i], 'assignees': users, 'ratings': []});

...并且一个条目可能如下所示:

{
  'story': 'some story',
  'assignees': ['Bob', 'Joe'],
  'ratings': []
}

然后,一旦用户输入了该故事的评级,它应该更新为如下所示:

{
  'story': 'some story',
  'assignees': ['Bob', 'Joe'],
  'ratings': [{'Bob': 2}, {'Joe': 5}] // maybe a better way to do this?
}

我在编写这条线时遇到了麻烦。我现在拥有的是:

var users = ['Bob', 'Joe'];
for (var i = 0; i < users.length; i++) {
  var user = users[i];
  var rating = {user: 1};
  Stories.update({}, {$push: {'ratings': rating}});
}

不幸的是,结果如下:

{
  'story': 'some story',
  'assignees': ['Bob', 'Joe'],
  'ratings': [{user: 1}]
}

也就是说,ratings数组中只有一个对象,甚至没有正确的密钥(普通user而不是Bob)。这可能与JS提升和对象实例化很棘手有关。任何见解都表示赞赏。

1 个答案:

答案 0 :(得分:4)

您的问题是您正在尝试将变量用作对象的“键”,这不起作用。使用括号[]表示法,以便动态分配“键”,如下所示:

var users = ['Bob', 'Joe'];
for (var i = 0; i < users.length; i++) {
  var user = users[i];
  var rating = {};
  rating[user] = 1;
  Stories.update({}, {$push: {'ratings': rating}});
}

实际上,您甚至可以通过一次更新来做得更好:

var users = ['Bob', 'Joe'];
var ratings = [];
for (var i = 0; i < users.length; i++) {
  var user = users[i];
  var rating = {};
  rating[user] = 1;
  ratings.push( rating);
}

Stories.update({}, {$push: {'ratings': { $each: ratings } }});

因此,$each修饰符允许您将新文档的“数组”推送到现有阵列,这意味着通过网络进行更少的更新。

不确定您执行此操作的位置,以便可能无法从具有minimongo的浏览器客户端获得第二个选项。但它可以从服务器那样调用。