用新的项目和值更新mongodb中的数组

时间:2018-12-03 16:25:03

标签: python mongodb pymongo

下载图像后,我正在尝试使用本地图像路径更新数组[[media_details]]。但是使用$ push只是在顶部添加了local_url。

这是['media_details']的样子:

"image_details": [
    {
      "processed": true,
      "position": 0,
      "seconds": "46",
      "src_url": "https://xxxxx/1.jpg",
      "image_fname": "1.jpg",
    },
    {
      "processed": true,
      "position": 1,
      "seconds": "55",
      "src_url": "https://xxxxx/2.jpg",
      "image_fname": "2.jpg",
    },

然后我的代码从src_url下载图像,我想将本地图像url添加到['media_details']。

job = mongo.db.JobProcess
job.update({'_id': db_id},
                   {'$push': {
                       'image_details': {
                           'local_url': img_local_file,

                       }
                   }})

这会将local_url添加到['media_details']的顶部-就像这样:

{'local_url': '/bin/static/5432ec0f-ea53-4fe1-83e4-f78166d1b9a6/1.jpg'}, 
{'local_url': '/bin/static/5432ec0f-ea53-4fe1-83e4-f78166d1b9a6/2.jpg'}, 
{'processed': True, 'position': 0, 'seconds': '46', 'src_url': 'https://xxxxx1.jpg', 'image_fname': '1.jpg'}

我想要做的是:

 "image_details": [
        {
          "processed": true,
          "position": 0,
          "seconds": "46",
          "src_url": "https://xxxxx/1.jpg",
          "image_fname": "1.jpg",
          "local_url": "/bin/static/5432ec0f-ea53-4fe1-83e4-f78166d1b9a6/1.jpg"
        },

但是哪个命令($ set,$ push,$ addToSet)最适合更新此命令?以及如何实施?

2 个答案:

答案 0 :(得分:1)

您需要使用位置运算符$更新image_details数组项。您将需要一个可以唯一标识数组项的查询,也许是src_url:

job.update({$and:[ 
                  {"_id": db_id},                              
                  {"image_details.src_url": img_src_url }
                  ]},
           {$set :{"image_details.$.local_url": img_local_file },
           {multi:false})

答案 1 :(得分:1)

您需要使用positional update operator

job.updateOne({
  '_id': db_id,
  'image_details.src_url': yourUrl,
}, {
  $set: {
    'image_details.$.local_url': img_local_file
});