MongoDB和Python:同一更新中的多个$ push。似乎只解释了最后的$ push

时间:2014-03-27 06:24:24

标签: python mongodb mongodb-update

我正在抓取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的新手,但已阅读有关updatepush的内容,并且无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分: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和其他修饰符。

答案 1 :(得分:0)

因为python dict的键是不同的,所以同一个键的多次赋值将导致只有最后一个赋值有效。

见这个简短的例子:

>>> {1: 2, 1: 3}
{1: 3}

但我认为您可以使用此语法:

'$push': {'scores': (current_time, score),
          'ups': (current_time, ups),
          'downs': (current_time, downs)}