pymongo如果不存在则插入记录

时间:2014-09-30 15:58:47

标签: python mongodb pymongo

你好我有以下集合,最初有一个空值

{
    "_id" : ObjectId("542abfe4a14c971c36c96ee3"),
    "values" : [],
    "name" : {
        "en-UK" : "Size"
    }
}

在我的代码中,我想测试值是否存在,如果没有,则将其添加到集合中,这是我到目前为止的代码:

def get_attribute_size(size_code, size_name):
    attribute_size_meta = db.attributes.aggregate([{ '$match': {'name.en-UK': 'Size'} },
        { '$unwind' : '$values' },
        { '$project': { 'code' : '$values.code', 'name' : '$values.name', 'valueId': '$values._id'} },
        { '$match': {
            '$and': [ 
                {'name.en-UK': str(size_name)}, 
                {'code': int(size_code)}
            ]
        }
    }])
    return attribute_size_meta['result']

def insert_missing_size(size_id, missing_size):
    attributes.update({ "_id" : size_id,},
    { "$addToSet": 
        { "values" : missing_size }
    })

我的missing_size就像:

{'code': u'3', 'name': {'en-UK': 'M'}, '_id': ObjectId('542ac47ba14c971c9b63353d')}
{'code': u'1', 'name': {'en-UK': '6 MTHS'}, '_id': ObjectId('542ac47ba14c971c9b633535')}
...

,生成它的代码是:

size_code_id = get_attribute_size(size_code, size_name)
mong_id = get_mongo_size_id()
# if size_code_id returns an empty list, i want to create the entry
if size_code_id == []:
    mongo_size = {
        "code" : size_code,
        "_id" : ObjectId(),
        "name" : {"en-UK" : size_name}
        }
    insert_missing_size(mongo_size, mongo_size)

insert_missing_size似乎没有正常工作,任何建议都非常赞赏

1 个答案:

答案 0 :(得分:1)

实际上非常简单

def insert_missing_size(missing_size):
    db.attributes.update( 
        { 'name': {'en-UK': 'Size'} }, 
        { "$push": 
            {
            "values": missing_size
            } 
        }, upsert=True
    )