我如何在 pymongo 中 update/add 多个数据库?

How do I update/add multiple DBs in pymongo?

公告板被抓取并存储在 MongoDB 中 Python pymongo。

如果缺少数据,我们想添加数据;如果数据存在且值不同,我们想更新它。

我该怎么做?

前一个代码

b = dict(title=thread_title, url=thread_url, res=sorted(all_res))
collection.insert(b)

尝试代码

collection.update_one({"$set":{"title": thread_title}}, {"$set":{"url": thread_url}}, {"$set":{"res": sorted(all_res)}}, upsert=True)

错误代码

TypeError Collection.update_one() got multiple values for argument 'upsert'

大约有 200 个 MongoDB 文档可用。

_id 62459b8d6ebc7c7b3e14b3ad

field:title "THREAD TITLE"

field:url "URLURLURL"

field:res Array 0 "#100 2022/02/20 13:22 comment blah blah blah" 1 "#101 2022/02/20 13:23 comment blah blah blah"

如果您尝试 'separate' 您的行代码,您会看到您为函数提供了 4 个参数,您提供的每个参数集都是一个参数,因此 upsert 将作为值 {"$set":{"res": sorted(all_res)}},你不应该分开 'update' 参数

除此之外,update_one 函数采用过滤器(它不是可选参数,您应该始终提供过滤器)。

有update_one函数的定义

update_one(filter, update, upsert=False, bypass_document_validation=False, collation=None, array_filters=None, hint=None, session=None)

最后,如果你想同时更新多个实例,你应该考虑 update_many 函数(它基本上与 update_one 的工作方式相同)。

这段代码应该可以工作,记得添加一个过滤器。

collection.update_one(
    {
        # your filter here for exemple
        "id" : id
    },
    {
        "$set":{
            "title": thread_title,
            "url": thread_url,
            "res": sorted(all_res)
        }
    }, 
    upsert=True)

mongo update official document

在您的更新查询中缺少过滤器部分:

collection.update_one(
     {
     // Your selection criteria for the update. The same query selectors as in the find() method
       "_id" : ObjectId("62459b8d6ebc7c7b3e14b3ad") //for example
     },
     {
       "$set":{
          "title": thread_title,
          "url": thread_url, 
          "res": sorted(all_res)
       }, 
        upsert=True
   })

以上查询将更新您 collection

中 id = 62459b8d6ebc7c7b3e14b3ad 的文档