在PyMongo中,如何找到文档的_id,否则插入并获取插入文档的_id

时间:2015-06-30 12:28:21

标签: python mongodb python-2.7 pymongo

例如:

我有一个故事'故事' 每个文件的格式如下:

{
  '_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']

这是否效率低,因为它会更新(修改)文档,即使它不是必需的?这可以提高效率吗

2 个答案:

答案 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)