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)}
Другие вопросы по тегам