MongoDB и Python: множественное нажатие $ в одном обновлении. Кажется, интерпретируется только последний толчок $
Я сканирую некоторые ссылки на Reddit и сохраняю результаты в коллекции MongoDB. Вот единственная строка в моем скрипте Python, которая хранит данные:
reddit_links_collection.update(
{'_id': id}, # query
{ # update rules
'$set': {
'title': title,
'url': url
},
'$push': {'scores': (current_time, score)},
'$push': {'ups': (current_time, ups)},
'$push': {'downs': (current_time, downs)}
},
upsert=True # insert new if no one matches the query
)
Я хочу выдвинуть значения во все три массива, но только 'downs'
храниться в моей базе данных. Что мне не хватает?
Я новичок в MongoDB, но прочитал о update
а также push
и не могу понять, что я делаю неправильно.
2 ответа
Вы должны поместить все толчки в один и тот же элемент. В том, как вы написали, не обязательно будет толкать последний - это может быть любой из них.
Вот правильный способ сделать это:
reddit_links_collection.update(
{'_id': id},
{
'$set': {
'title': title,
'url': url
},
'$push': {
'scores': (current_time, score),
'ups': (current_time, ups),
'downs': (current_time, downs)
},
upsert=True
)
Кстати, так же обстоят дела с $add и другими модификаторами.
Потому что ключи питона dict
различаются, множественное назначение для одного и того же ключа приведет к тому, что только последнее назначение будет действительным.
Посмотрите этот короткий пример:
>>> {1: 2, 1: 3}
{1: 3}
Но я думаю, что вы можете использовать этот синтаксис вместо:
'$push': {'scores': (current_time, score),
'ups': (current_time, ups),
'downs': (current_time, downs)}