Позиционный оператор 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
значение.
Так что это не имеет ничего общего с позиционным $
оператор в этом случае, так как вы не обновляете и массив в совпадающей позиции, для чего это нужно.