在 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)?
编辑:
- 我正在使用格式为 'dd-mm-yyyy'.
的字段 'dated' 查找文档
- 如果文档中的某个字段不存在,则应创建该字段
您可以使用 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 update
与 upsert = True
和 multi = True
如果没有文档匹配您的过滤器,则执行插入。但是,您将需要遍历每个 key
以更新 现有文档
if col.count() > 0:
col.insert(d)
else:
# your_update
我有一个 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)?
编辑:
- 我正在使用格式为 'dd-mm-yyyy'. 的字段 'dated' 查找文档
- 如果文档中的某个字段不存在,则应创建该字段
您可以使用 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 update
与 upsert = True
和 multi = True
如果没有文档匹配您的过滤器,则执行插入。但是,您将需要遍历每个 key
以更新 现有文档
if col.count() > 0:
col.insert(d)
else:
# your_update