У меня есть документ, который структурирован так:
{
'item_id': '12345'
'total_score': 100,
'user_scores': {
'ABC': 40,
'DEF': 60
}
}
Я использую PyMon go, но документация MongoDB кажется легко переводимой между различными дистрибутивами. С PyMon go я мог бы обновлять оценки пользователей следующим образом:
collection.update_one(
{ 'item_id': '12345' },
{ '$set': { 'user_scores.GHI': 20 } },
upsert=True
)
Что приводит к следующему:
{
'item_id': '12345'
'total_score': 100,
'user_scores': {
'ABC': 40,
'DEF': 60,
'GHI': 20
}
}
Конечно, проблема в том, что total_score
теперь неверна. Я хочу, чтобы этот общий балл обновлялся, чтобы в будущем запросе я мог быстро определить оценку каждого результата и даже отсортировать по баллам.
Одним из решений может быть поиск существующего документа с использованием find_one({'item_id: '12345'})
, (создать, если он не существует), затем обновить с новыми оценками, и обновить общий счет. Проблема в том, что я хочу запустить тысячи из них одновременно, и гораздо эффективнее вызывать bulk_write
для ряда запросов.
Итак, лучшим решением было бы сделать два последовательных запросы на обновление:
request1 = UpdateOne(
{ 'item_id' : '12345' },
{ '$set': { 'user_scores.GHI': 20 } },
upsert = True
)
request2 = UpdateOne(
{ 'item_id' : '12345' },
{ '$set': { 'total_score': { '$sum': { '$values': 'user_scores' } } } },
upsert = True
)
Первый запрос обновляет оценки пользователей так же, как и раньше. Второй запрос, есть две концепции. Синтаксис этого неправильный, но вот что я пытаюсь сделать:
- Мне нужно получить значения из словаря
user_scores
. { '$values': 'user_scores' }
- вот как я пытался это передать. - Это дает мне массив значений. Я знаю, что все это числа c, поэтому мне нужно сложить их, переданные с помощью
{ '$sum': { '$values': 'user_scores' } }
.
. Я могу последовательно запускать эти пакетные обновления, поэтому нет риска суммировать неправильные вещи. , Опасность наличия поля total_score
всегда заключается в том, что оно не обновляется и, следовательно, не содержит правильного номера. Я полагаю, что это общий случай с документами на основе моделей?