2 回答
TA贡献1875条经验 获得超5个赞
我们可以使用$[identifier]运算符来更新数组中的特定对象
所以你的更新查询应该看起来像
db.collection.updateOne(
{ _id: <OBJECT_ID> }, // filter part, add the real objectId here
{ $set: { 'orders.$[order].handleName': 'Donald Stark' } }, // update part
{ arrayFilters: [{ 'order.userId': 1, 'order.handleName': 'John Doe' }]
})
$[order] 仅更新与数组过滤器中的条件匹配的对象
更新
如果你有一个内部数组,并且你需要对该内部数组中的元素做同样的事情,我们可以使用类似的东西
db.collection.updateOne(
{ _id: <OBJECT_ID> }, // filter part, add the real objectId here
{ $set: {
'orders.$[order].handleName': 'Donald Stark', // to set the handleName in the elements of the outer array
'orders.$[].others.$[other].handleName': 'Donald Stark' // to set the handleName in the elements of the inner array
} },
{ arrayFilters: [{ 'order.userId': 1, 'order.handleName': 'John Doe' }, { 'other.userId': 1, 'other.handleName': 'John Doe' }] }
)
我们曾经$[]循环遍历订单数组中的所有元素,然后$[other]根据数组过滤器中的新条件更新内部数组中的特定元素
希望能帮助到你
TA贡献2003条经验 获得超2个赞
这样的事情能解决你的问题吗?
d = {
"_id": <OBJECT_ID>,
"orders": [
{
"userId": 1,
"handleName": "John Doe",
"orderAmount": 3
},
{
"userId": 2,
"handleName": "Maria Gigante",
"orderAmount": 2
},
{
"userId": 1,
"handleName": "John Doe",
"orderAmount": 4
},
{
"userId": 3,
"handleName": "John Doe",
"orderAmount": 4
}
]
}
def change_name(usr_id, old_name, new_name):
for usr in d['orders']:
if usr['userId'] == usr_id and usr['handleName'] == old_name:
usr['handleName'] = new_name
change_name(1, 'John Doe', 'Donald Stark')
添加回答
举报