Python3、MongoDB仅在文档不存在时插入

2024-06-02 12:45:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一个从API中提取数据的字典,我给每个数据点指定了它自己的变量(job_id、jobtitle、company等):

output = {
        'ID': job_id, 
        'Title': jobtitle, 
        'Employer' : company, 
        'Employment type' : emptype, 
        'Fulltime' : tid, 
        'Deadline' : deadline, 
        'Link' : webpage
}

我想添加到我的数据库中,非常简单:

db.jobs.insert_one(output)

但这是一个for循环,它将创建30个独特的新文档,包括名称、标题、链接等等,这个脚本将运行不止一次,所以我希望它能做的只是在数据库中不存在的情况下,将“输出”作为文档插入,所有这些新文档都有自己的唯一ID,来自于作业ID变量,我能检查一下吗


Tags: 数据文档apiid数据库output字典title
2条回答

编辑:

替换

db.jobs.insert_one(output)

db.jobs.replace_one({'ID': job_id}, output, upsert=True)

原始答案和工作示例:

^{}upsert=True一起使用。您可以多次运行此操作,如果未找到ID,则将使用insert;如果找到,则使用replace。这并不是您所要求的,因为数据总是更新的(因此更新的数据将覆盖任何现有数据)

from pymongo import MongoClient


db = MongoClient()['mydatabase']

for i in range(30):
    db.employer.replace_one({'ID': i},
    {
            'ID': i,
            'Title': 'jobtitle',
            'Employer' : 'company',
            'Employment type' : 'emptype',
            'Fulltime' : 'tid',
            'Deadline' : 'deadline',
            'Link' : 'webpage'
    }, upsert=True)

# Should always print 30 regardless of number of times run.
print(db.employer.count_documents({}))

您需要尝试两件事:

1)做{}&;如果没有为给定的job_id找到文档,那么向DB写入是一个双向调用-相反,您可以在job_id字段上有一个unique-index,如果您的操作试图插入重复文档,它将抛出一个错误(具有唯一索引是避免重复的更安全的方法,即使代码逻辑失败也很有帮助)

2)如果您有30个dict,则无需重复30次&;使用insert_one进行30次数据库调用,您可以使用insert_many来接收dict&;写入数据库

注意:默认情况下,所有dict都是按照它们在数组中的顺序写入的,如果一个dict因重复错误而失败,那么insert_many在该点失败而不插入其他dict,因此要克服这一点,您需要传递一个选项 ordered=False这样,除了重复的字典外,所有字典都将被插入

相关问题 更多 >