即时更新 mongodb
update mongodb on fly
我有一个 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 命令动态地执行此操作?即我不必处理 if else 条件?理想情况下,我实际上想在此处删除 for
语句,因为我也在更新 mongodb 中的其他内容,并且这些内容不需要循环。
在文档中,$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 })
我有一个 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 命令动态地执行此操作?即我不必处理 if else 条件?理想情况下,我实际上想在此处删除 for
语句,因为我也在更新 mongodb 中的其他内容,并且这些内容不需要循环。
在文档中,$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 })