我有一个python字典,表示要对mongo文档进行的更新:
@ConversationScope
字段可以很多,为简单起见,我只显示了'1','2'和'r1'。 我想将各种数组中的所有值推送到已经在mongo中的文档中的各自字段(使用字段'dated',我在变量中)。
例如:如果db中的文档是:
{
'1': [{'x': 21, 'y': 37}, {'x': 12, 'y': 41}],
'2': [{'x': 17, 'y': 19}, {'x': 82, 'y': 31}],
...
...
'r2': [{'x': 21, 'y': 37}, {'x': 12, 'y': 41}]
...
...
}
更新后,它应该成为:
{
'1': [{'x': 47, 'y': 33}]
...
}
我不想使用$ pushAll,因为mongodb文档说它是deprecated。那么如何在每个字典键上使用$ push with $ each(或其他一些运算符),其值是一个数组(在python 2.7中使用pymongo)?
编辑:
答案 0 :(得分:1)
您可以在Pymongo 3.x或collection.find_one_and_update
(DEPRECATED)中使用collection.find_and_modify
。
d = {
'1': [{'x': 21, 'y': 37}, {'x': 12, 'y': 41}],
'2': [{'x': 17, 'y': 19}, {'x': 82, 'y': 31}]}
for k, v in d.items():
col.find_and_modify({k: {"$exists": True}}, {"$push": {k: {"$each": v}}})
Pymongo 3.x
for k, v in d.items():
col.find_one_and_update({k: {"$exists": True}}, {"$push": {k: {"$each": v}}})
编辑:
如果没有与您的过滤器匹配的文档,请update_many
与upsert=True
或update
与upsert = True
和multi = True
执行插入操作。但是,您需要遍历每个key
以更新现有文档
if col.count() > 0:
col.insert(d)
else:
# your_update