在python中的所有字段上使用$ each和$ push

时间:2015-06-02 04:16:41

标签: python mongodb python-2.7 pymongo

我有一个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)?

编辑:

  1. 我使用“已过时”字段找到该文档,其格式为“dd-mm-yyyy”。
  2. 如果在文档中不存在字段,则应创建

1 个答案:

答案 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_manyupsert=Trueupdateupsert = Truemulti = True执行插入操作。但是,您需要遍历每个key以更新现有文档

if col.count() > 0:
    col.insert(d)
else:
    # your_update