在飞行中更新mongodb

时间:2015-05-10 05:27:56

标签: python mongodb pymongo

我有一个mongodb数据库,它存储如下值:

{'_id':1, "summary":{"tags": {"Good":1, "bad": 4}}}

我想这样做,我可以输入任何新标签并更新现有标签的数量。

所以喜欢:

db = pymongo.MongoClient().collection.summary
tags = ['Good', 'Enjoy']
id_tags =db.find_one({'_id':1})[summary][tags].keys()
for i in tags:
    if i in id_tags:
       db.update('_id':1, {"$inc":{'summary.tags.{}'.format(i):1})
    else:
       db.update('_id':1,{"$set":{'summary.tags.{}'.format(i):1}})

有没有办法可以在一个mongodb命令中动态执行此操作?即我不需要处理其他情况?理想情况下,我实际上想在这里删除for语句,因为我也在更新mongodb中的其他内容,并且不需要循环。

1 个答案:

答案 0 :(得分:3)

从文档中,$inc运算符按指定值递增字段,并具有以下格式:

{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }

如果该字段不存在,$inc将创建该字段并将该字段设置为指定值。因此,在您的情况下,for循环变得不必要,因为您只需要在多个字段上设置$inc运算符进行一次原子更新:

db = pymongo.MongoClient().collection.summary
db.update_one({'_id': 1}, 
    { 
        '$inc': {
            'summary.tags.Good' : 1,
            'summary.tags.Enjoy': 1
        }
    })

- 更新 -

要动态更新密钥,您需要先创建一个包含密钥和增量值的字典:

tags = ['Good', 'Enjoy']
tags_dict = {}
for tag in tags:
    tags_dict['summary.tags.'+tag] = 1
db = pymongo.MongoClient().collection.summary
db.update_one({'_id': 1}, {'$inc': tags_dict })