首页 > 解决方案 > Python Mongodb update_one() 不会更新数据库

问题描述

我有一个带有文档的MongoDB。其中一些有可下载音频的链接。它看起来基本上是这样的:

    "_id" : ObjectId("5ece21d39dfe015b29ec4812"),
    "date" : "some date",
    "path" : "path/to/raw/file",
    "has_audio" : true,
    "audio_downloaded" : false,
    "audio_link" : "some link",
    "audio_file" : "None",

我的脚本应该检查“has_audio”是否为真,“audio_downloaded”是否为假。这很好用。之后它会下载文件,完成后它应该会在 Mongodb 中输入:

audio_downloaded:是的,

音频文件:“路径/到/audiofile.mp3”

这对我不起作用,它不会更新。这是我的代码和我尝试过的:

import os
import urllib.request
import pymongo

client = pymongo.MongoClient("mongodb://localhost:27017/")
database = client["DW"]
col = database["document"]
for entry in col.find({"has_audio": {"$eq": True}, "audio_downloaded": {"$ne": True}}):
    audio_link = entry['audio_link']
    file_path = entry['path']
    file_path = os.path.dirname(file_path) + "/"
    audio_file_name = os.path.basename(audio_link)
    audio_file_path = file_path + audio_file_name
    urllib.request.urlretrieve(audio_link, audio_file_path)
    col.update_one({'audio_downloaded': entry['audio_downloaded']}, {'$set': {'audio_downloaded': True}})
    col.update_one({'audio_file': entry['audio_file']}, {"$set": {"audio_file": audio_file_path}})

标签: pythonmongodb

解决方案


您语句上的过滤器update_one()将更新由数据库决定的第一条匹配记录,与记录无关entry

用以下内容替换最后两行,这将匹配唯一_id字段:

col.update_one({'_id': entry.get('_id')}, {'$set': {'audio_downloaded': True, "audio_file": audio_file_path}})

推荐阅读