使用位置$ operator和$ inc更新ObjectId数组

时间:2016-03-24 16:32:40

标签: mongodb meteor mongodb-query

我有一个流星应用程序,我想用位置运算符从服务器端更新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存在一个限制,它会影响位置运算符的使用和增加的值。

1 个答案:

答案 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不会增加,当他们已经在那里时,他们也不会被添加到阵列中。