我有一个流星应用程序,我想用位置运算符从服务器端更新mongo文档。我还想增加值voted
。
我的mongo文档如下:
{
_id: "yBonLeLPTcffxJwY9",
endDate: "someDate",
name: "Foo",
options: [
{
name: "bar",
voted: 1,
usersId: ["yBonLeLPTczzaJwY9"]
}
]
}
我的更新请求如下:
Votes.update({
_id: mongoId,
'options.name': voteName
}, {
$inc: {'options.$.voted': 1},
$push: {'options.$': {usersId: userId}}
});
我收到此错误消息:
MongoError:字段'options.1'必须是数组,但在文档{_id:“yBonLeLPTcffxJwY9”}
中的类型为Object
我在几个论坛上发现,minimongo存在一个限制,它会影响位置运算符的使用和增加的值。
答案 0 :(得分:0)
错误告诉你正确的事情。您包括“文档”而不是普通成员。所以语法有点不同:
Votes.update({
_id: mongoId,
'options.name': voteName
}, {
$inc: {'options.$.voted': 1},
$push: {'options.$.usersId': userId}
});
因此,在“点符号”中将内部字段完全引用到要添加到$push
的数组中。这解决了错误。
我还建议在“投票”系统中,您应首先检查条目的usersId
数组:
Votes.update({
_id: mongoId,
'options.name': voteName,
'options.usersId': { '$ne': userId }
}, {
$inc: {'options.$.voted': 1},
$push: {'options.$.usersId': userId}
});
这样,当投票的人再次投票时,你的$inc
不会增加,当他们已经在那里时,他们也不会被添加到阵列中。