MongoDB如何删除所有文档中匹配userId条件的嵌套metaData对象
问题分析
- 第一个错误:
update_many的第一个参数是查询过滤条件,原代码填了空对象{},会匹配集合内所有文档,没有筛选出metaData.userId等于指定值的目标文档。 - 第二个错误:
$pull是用于删除数组中指定元素的操作符,你的需求是删除文档顶层的metaData字段,应该使用$unset操作符。 - 第三个错误:
update_many方法本身就默认批量更新所有匹配的文档,不需要额外加multi=True参数,该参数是旧版update方法的配置项。 - 第四个错误:你调用了
result.deleted_count,这个属性只有执行删除操作时才会返回计数,更新操作应该用modified_count获取实际修改的文档数量。
正确实现代码
@app.route('/data/anonymousData/<int:user_id>', methods = ['POST']) def makeanonymous(user_id): # 第一个参数:筛选出metaData.userId等于传入值的所有文档 # 第二个参数:用$unset删除metaData字段 result = collection.update_many( {"metaData.userId": user_id}, {"$unset": {"metaData": ""}} ) # 返回实际修改的文档数量 return f'已修改 {result.modified_count} 个文档的字段。'
补充说明
如果你后续希望保留metaData对象,只删除里面的用户隐私字段,只需要修改$unset的内容即可,比如:
{"$unset": {"metaData.userId": "", "metaData.gender": "", "metaData.ageGroup": ""}}
内容的提问来源于stack exchange,提问作者youngt17
相关产品推荐
相关产品推荐

