我正在 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 提升和对象实例化的棘手有关。任何见解都值得赞赏。
最佳答案
您的问题是您尝试使用变量作为对象的“键”,但这种方式不起作用。使用括号 []
表示法来动态分配“key”,如下所示:
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 的浏览器客户端可能无法使用第二个选择。但可以从服务器以这种方式调用它。
关于javascript - 通过 Meteor 将新对象添加到 Mongo 文档中的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880054/