MongoDB将子文档中单个phone字段转换为数组的正确方法
解决MongoDB中每个address子文档的phone字段转数组的问题
要实现为每个address子文档将当前phone值转为数组的第一个元素,你需要用$map操作符遍历address数组,逐个修改子文档里的phone字段,而不是直接对address.phone进行赋值。
正确的更新代码
db.students.updateMany( { "address.phone": { $exists: true } }, [ { $set: { address: { $map: { input: "$address", as: "addr", in: { // 保留address子文档的其他字段,仅修改phone ..."$$addr", phone: ["$$addr.phone"] } } } } } ] )
为什么之前的代码无效
- 第一段代码中,
"$address.phone"会提取当前文档所有address子文档的phone值,组成一个数组,再用["$address.phone"]包裹就会形成嵌套数组(比如[[123,456]]),这不是你要的单个address子文档的处理逻辑。 - 第二段代码直接把
"$address.phone"返回的数组赋值给每个address.phone,导致所有address子文档共享同一个手机号数组,不符合需求。
代码说明
$map遍历address数组的每个元素(用$$addr指代当前元素)...$$addr保留子文档原有的所有字段(比如可能存在的street、city等)phone: ["$$addr.phone"]把当前子文档的单个phone值包装成数组,确保每个address子文档的phone都是独立的数组,且原数值是第一个元素。
内容的提问来源于stack exchange,提问作者lotsaquestions
相关产品推荐
相关产品推荐

