TypeError update() 为参数'upsert'获取了多个值,$setOnInsert



我正在尝试通过文件系统扫描文件系统 - 如果文件在db中,则更新。如果不是,请插入新记录。但是我遇到了这个错误" typeError update()有多个值的参数'upsert'"

我在这里做错了什么?

def scan_for_file(dir_path, storage_bucket):
    for file in os.listdir(dir_path):
        curpath = os.path.join(dir_path, file)
        if os.path.isfile(curpath):
            print('found file:', file)
            print('checking db')
            collection = db.file_collection
            cursor = collection.find({'file_path': curpath})
            for document in cursor:
                file_db_id = document['_id']
                file_accessed = datetime.datetime.fromtimestamp(os.path.getatime(curpath))
                file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
                file_created = datetime.datetime.fromtimestamp(os.path.getctime(curpath))
                file_size = os.stat(curpath).st_size
                file_convert_size = convert_size(file_size)
                utc_datetime = datetime.datetime.utcnow()
                update_id = collection.update_one({'_id': file_db_id}, {
                    "$set": {
                    "file_size": file_convert_size,
                    "file_size_bytes": file_size,
                    "process_datestamp": utc_datetime.strftime("%Y-%m-%d %H:%M:%S"),
                    "file_created": file_created,
                    "file_accessed": file_accessed,
                    "file_modified": file_modified}},
                    {
                    "$setOnInsert": {
                    "file_path": curpath,
                    "file_name": file,
                    "file_size": file_convert_size,
                    "file_size_bytes": file_size,
                    "process_datestamp": utc_datetime.strftime("%Y-%m-%d %H:%M:%S"),
                    "file_$reated": file_created,
                    "file_accessed": file_accessed,
                    "file_modified": file_modified}}, upsert=True,
                                                  )
                update_id
                print('ID Updated:', file_db_id)
                print('updating document id:')
        else:
            print('This is not a file:', file)

tldr;该代码有两个错误:upsert=True,。一个额外的","和额外的" {}"


将您的更新操作修改为:

update_id = collection.update_one(
    {'_id': file_db_id},
    {
        "$set": {
                "file_size": file_convert_size,
                "file_size_bytes": file_size,
                "process_datestamp": utc_datetime.strftime("%Y-%m-%d %H:%M:%S"),
                "file_created": file_created,
                "file_accessed": file_accessed,
                "file_modified": file_modified
        },
        "$setOnInsert": {
                "file_path": curpath,
                "file_name": file,
                "file_size": file_convert_size,
                "file_size_bytes": file_size,
                "process_datestamp": utc_datetime.strftime("%Y-%m-%d %H:%M:%S"),
                "file_$reated": file_created,
                "file_accessed": file_accessed,
                "file_modified": file_modified
        }
    },
    upsert=True)

您的代码有两个错误:首先,您要为$set添加一个额外的{}$setOnInsert请参阅DOCS

另外,您正在执行upsert=True,。请参阅此额外的,,这会在Python中产生元组。

最新更新