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

Using $each with $push on all fields in python

我有一个 python 字典,表示要对 mongo 文档进行的更新:

{
    '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”、“2”和 'r1'。 我想将各种数组中的所有值推送到已经在 mongo 中的文档中的各自字段(使用我在变量中的字段 'dated')。

例如:如果数据库中的文档是:

{
    '1': [{'x': 47, 'y': 33}]
    ...
}

更新后应该变成:

{
    '1': [{'x':47, 'y': 33}, {'x': 21, 'y': 37}, {'x': 12, 'y': 41}]
    ...
}

我不想使用 $pushAll,因为 mongodb 文档说它 deprecated。那么如何在值为数组的每个字典键上使用 $push 和 $each (或其他一些运算符)(在 python 2.7 中使用 pymongo)?

编辑:

  1. 我正在使用格式为 'dd-mm-yyyy'.
  2. 的字段 'dated' 查找文档
  3. 如果文档中的某个字段不存在,则应创建该字段

您可以使用 collection.find_one_and_update in Pymongo 3.x or 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 with upsert=True or updateupsert = Truemulti = True 如果没有文档匹配您的过滤器,则执行插入。但是,您将需要遍历每个 key 以更新 现有文档

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