我有一个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中的其他内容,并且不需要循环。
答案 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 })