我在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提升和对象实例化很棘手有关。任何见解都表示赞赏。
答案 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的浏览器客户端获得第二个选项。但它可以从服务器那样调用。