例如:
我有一个故事'故事' 每个文件的格式如下:
{
'_id': <default>
'story': <some very long string which should be unique in the collection>
}
现在每当我有一个故事时,如果它已经存在于故事中,我想要它的&#39; _id&#39;,否则插入一个带有故事的新文档&#39;字段集,并获得其&#39; _id&#39;
我能想到的是:
story = "this is a very long story"
id = stories_col.find_one_and_update({
'story': story,
}, {
'story': story,
}, upsert=True, return_document=ReturnDocument.AFTER)['_id']
这是否效率低,因为它会更新(修改)文档,即使它不是必需的?这可以提高效率吗
答案 0 :(得分:5)
您参与其中,使用$setOnInsert
修改更新操作:
story = "this is a very long story"
id = stories_col.find_one_and_update({
'story': story,
}, {
'$setOnInsert': { 'story': story }
}, upsert=True, return_document=ReturnDocument.AFTER)
这意味着如果文档匹配,则会执行“无实际”写入,因为此处唯一有效的操作是“插入”。
通常建议“始终”使用适合您的操作的update operators,因为您使用“始终”的“原始”对象会替换文档中的“所有内容”。
答案 1 :(得分:1)
你唯一能做得更好的就是定义一个函数:
def make_sure_exists(story, stories_col):
data = stories_col.find_one({'story': story})
if data is not None:
return data.['_id']
return stories_col.insert_one({'story': story}).inserted_id
除非你有足够新版本的mongo,否则你可以使用$setOnInsert操作:
story = "this is a very long story"
id = stories_col.find_one_and_update({
'story': story,
}, {
'story': { '$setOnInsert': story }
}, upsert=True, return_document=ReturnDocument.AFTER)