0

我正在尝试更新我的 mongodb 集合“用户”中的某个字段

文档示例:

{
  _id: ObjectId("536d4d3307221f847fbbea49"),
  groups: [
    {
      match_id: "dc3acf1b",
      groupName: "World Cup, Group A",
      score:[0,1]
    },
    {
      match_id: "d4f14940",
      groupName: "World Cup, Group A",
      score:[2,1]
    }],
  name:"Foo Bar",
  points:10
}

我正在尝试仅更新具有特定分数的分数字段..

这是我想要的(位置运算符):

db.users.update({'groups.match_id':i_match , 'groups.score':i_score},
                {$inc:{points:1}});

现在我想这会寻找同时拥有这两个字段的用户,但我想查看具有查询第一部分的相同组对象。

如:

 db.users.update({'groups.match_id':d4f14940 , 'groups.score':[2,1]},
                    {$inc:{points:1}});

应该给用户+1分

但:

 db.users.update({'groups.match_id':dc3acf1b , 'groups.score':[2,1]},
                        {$inc:{points:1}});

不应该

你明白我的意思:)

现在我从位置运算符那里知道我应该使用“$”符号,但我认为只能在 update() 的第二个参数中使用 - 更新部分..而不是查找部分

注意- 以这种方式(数组)实际比较分数可能不起作用..但这不是这里的问题

4

1 回答 1

1

你想要的是$elemMatch运营商。这允许您选择需要多个字段来匹配条件的数组元素:

db.users.update(
    { "groups": { 
        "$elemMatch": {
          "match_id": "d4f14940",
          "score": [2,1]
        }      
    }},
    { "$inc": { "points": 1 } }
)

因此,这允许您匹配文档,因为“组”数组包含一个元素,该元素同时具有match_id并且score满足您提供的条件。如果您在match_id不更改分数的情况下更改它,则文档不匹配,并且不会对您的points值进行增量。

因此,在这种情况下,这与位置运算符无关,$因为您没有在匹配的位置更新和排列数组,这就是这样做的。

于 2014-05-09T23:52:38.873 回答