背景
工作中遇到的大概可以份三种情况,
- 更新数组中的某个值或数组字典中的某个值,
- 向数组中增加单个元素,
- 向数组中删除某个特定的元素,
# 第一种情况 更新数组中的某个值
# 初始化数据
ret = test_coll.insert_many([
{"_id": 1, "grades": [85, 80, 80]},
{"_id": 2, "grades": [88, 90, 92]},
{"_id": 3, "grades": [85, 100, 90]}
],
)
test_coll.update_one({'grades': 85}, {'$set': {"grades.$": 82}})
# 只会更新匹配的数组中的第一个
# 更新的文档变成 {"_id": 1, "grades": [82, 80, 80]},
# 当数组中嵌套的为字典时:
ret = test_coll.insert_many([
{
'_id': 4,
'grades': [
{'grade': 80, 'mean': 75, 'std': 8},
{'grade': 85, 'mean': 90, 'std': 5},
{'grade': 85, 'mean': 85, 'std': 8}
]
}
],
)
test_coll.update_one({'grades.grade': 85}, {'$set': {"grades.$.std": 18}})
# 其中匹配的第一个更细为 {'grade': 85, 'mean': 90, 'std': 18},
# 注意查询条件中需要数组中嵌套的字段
# 第二种情况
#向数组中嵌套的字典增加单个元素,使用$addToSet
test_coll.update_one({'_id': 1}, {'$addToSet': {'grades': 50}})
#结果:{"_id": 1, "grades": [82, 80, 80,50]}
#如果添加的元素是列表,则会当成一个元素添加
# 如果需要把列表中的元素分散添加 则可以用each
test_coll.update_one({'_id': 2}, {'$addToSet': {'grades': {'$each': [90,30, 40]}}})
#第三种情况使用pull,想当初查询出来后一个个做比较然后再删除,再更新,相比而言pull在查找时就删除更新,
#效率高了很多
https://docs.mongodb.com/manual/reference/operator/update/pull/
总结
当不熟悉或者没有查到对应的清晰资料时,可以以完成任务为首要原则,同时心里要记下这里是否可以优化,多看官方文档,找到较佳方案