Позиционный оператор mongodb в поисковой части update()

Я пытаюсь обновить определенное поле в моей коллекции пользователей "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() - обновляющей части... а не поисковой части

примечание - фактическое сравнение оценки таким образом (массивы) может не работать.. но это не проблема здесь

1 ответ

Решение

То, что вы хотите, это $elemMatchоператор. Это позволяет вам выбирать элементы массива, которым требуется несколько полей для соответствия условию:

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

Это позволяет сопоставить документ, так как массив "groups" содержит элемент, который имеет match_id а также score которые отвечают условиям, которые вы поставили. Если вы измените это match_id без изменения счета, то документ не совпадает, и приращение не выполняется points значение.

Так что это не имеет ничего общего с позиционным $ оператор в этом случае, так как вы не обновляете и массив в совпадающей позиции, для чего это нужно.

Другие вопросы по тегам