我目前有一本字典,其中的数据是从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,我可以对此进行检查吗?
答案 0 :(得分:0)
您需要尝试两件事:
1)执行.find()
并且如果没有找到给定job_id
的文档,则向数据库写入是一种双向调用-相反,您可以拥有一个unique-index在job_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({}))