Python3,MongoDB仅在文档不存在时才插入

时间:2020-03-22 23:48:43

标签: python python-3.x mongodb mongodb-query pymongo

我目前有一本字典,其中的数据是从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个带有名称,标题,链接和其他内容的独特的新文档,此脚本将运行多次,所以我只想执行此操作如果数据库中尚不存在“输出”作为文档插入,那么所有这些新文档都具有来自 job_id 变量的自己的唯一ID,我可以对此进行检查吗?

2 个答案:

答案 0 :(得分:0)

您需要尝试两件事:

1)执行.find()并且如果没有找到给定job_id的文档,则向数据库写入是一种双向调用-相反,您可以拥有一个unique-indexjob_id字段上,如果您的操作尝试插入重复的文档,则会引发错误(拥有唯一索引是避免重复的更安全的方法,即使代码逻辑失败也有帮助)。

2)如果您有30份字典-您无需重复进行30次并使用insert_one进行30次数据库调用,则可以使用insert_many接受一系列dict的&写入数据库。

注意:默认情况下,所有dict均按照它们在数组中的顺序写入,以防万一dict因重复错误而失败,则insert_many会在此时失败而不插入休息别人,所以要克服这个问题,您需要通过一个选择 ordered=False那样,将插入除重复项之外的所有字典。

答案 1 :(得分:0)

编辑:

替换

db.jobs.insert_one(output)

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

带有示例的原始答案:

replace_one()upsert=True一起使用。您可以运行多次,如果找不到ID,它将带有插入;如果找到,则将其替换。这并不是您要的,因为数据总是会更新(因此,新数据将覆盖任何现有数据)。

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({}))