Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3、MongoDB仅在文档不存在时插入_Python_Python 3.x_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

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

Python3、MongoDB仅在文档不存在时插入,python,python-3.x,mongodb,mongodb-query,pymongo,Python,Python 3.x,Mongodb,Mongodb Query,Pymongo,我目前有一个从API中提取数据的字典,我给每个数据点指定了它自己的变量(job_id、jobtitle、company等): 我想添加到我的数据库中,非常简单: db.jobs.insert_one(output) 但这是一个for循环,它将创建30个独特的新文档,包括名称、标题、链接等等,这个脚本将运行不止一次,所以我希望它能做的只是在数据库中不存在的情况下,将“输出”作为文档插入,所有这些新文档都有自己的唯一ID,来自于作业ID变量。我能检查一下吗?您需要尝试两件事: 1)Doing.fi

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

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

db.jobs.insert_one(output)

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

您需要尝试两件事:

1)Doing
.find()
&如果没有为给定的
job\u id
找到文档,那么向DB写入是一个双向调用-相反,您可以有一个on
job\u id
字段,如果您的操作试图插入重复的文档,该字段将抛出错误(使用唯一索引是避免重复的更安全的方法,即使在代码逻辑失败的情况下也很有用)

2)如果您有30个dict,则无需重复30次并使用
insert\u one
进行30次数据库调用,相反,您可以使用它接收dict数组并写入数据库

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

您需要尝试两件事:

1)Doing
.find()
&如果没有为给定的
job\u id
找到文档,那么向DB写入是一个双向调用-相反,您可以有一个on
job\u id
字段,如果您的操作试图插入重复的文档,该字段将抛出错误(使用唯一索引是避免重复的更安全的方法,即使在代码逻辑失败的情况下也很有用)

2)如果您有30个dict,则无需重复30次并使用
insert\u one
进行30次数据库调用,相反,您可以使用它接收dict数组并写入数据库

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

编辑:

替换

db.jobs.插入一个(输出)

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

原始答案和工作示例:

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

编辑:

替换

db.jobs.插入一个(输出)

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

原始答案和工作示例:

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


所以这个脚本所做的就是从一个API中提取一些信息,它产生大约30个文档,但也可能是50个或27个,我想做的是反复运行这个脚本,但只在集合或数据库中不存在新数据时才写新数据,为了避免在数据库中出现相同信息的副本,“job_id”变量从API中提取一个唯一的id,该id与每个文档中的其余信息一起。对不起,我应该解释一下。我提供的代码只是一个示例,用来展示它是如何工作的。您所需要做的就是替换
db.jobs。用
db.jobs插入一个(输出)
。替换一个({'ID':job\u ID},output,upsert=True)
。我已经更新了答案。@BellyBuster:这可能有效,也可能无效!!如果您今天插入了一个文档并对其进行了几次更新,那么明天重复插入将用任何新值覆盖整个文档,或者如果请求中没有字段,则会删除这些字段(主要是如果每隔一天执行一次相同的操作)…这是正确的;如果这不是询问者想要的,他们将需要找到一个不同的方法,例如,你发布的方法。因此,脚本所做的是从API中提取一些信息,它生成大约30个文档,但也可能是50或27个,我希望能够反复运行此脚本,但是,只有在集合或数据库中不存在新数据时才写入新数据,这样数据库中就不会出现相同信息的副本,“job_id”变量会从API中提取一个唯一的id,该id与每个文档中的其余信息属于同一个id。我提供的代码只是一个示例,用来展示它是如何工作的。您所需要做的就是替换
db.jobs。用
db.jobs插入一个(输出)
。替换一个({'ID':job\u ID},output,upsert=True)
。我已经更新了答案。@BellyBuster:这可能有效,也可能无效!!如果您今天插入了一个文档并对其进行了几次更新,那么明天重复插入将用任何新值覆盖整个文档,或者如果请求中没有字段,则会删除这些字段(主要是如果每隔一天执行一次相同的操作)…这是正确的;如果这不是询问者想要的,他们将需要找到一个差异
db.jobs.insert_one(output)
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({}))