MongoDB聚合管道中如何将嵌套数组内的_id替换为id?
MongoDB聚合管道替换嵌套数组中的_id为id
问题场景
原始Product文档结构如下:
{ _id: "some-id", name: "one", variations: [{ _id: "some-other-id", some: "data" }] }
需求是在聚合查询时,将文档外层和嵌套数组variations中的_id字段替换为id。目前能实现外层的替换,但嵌套数组处理失败——现有代码会让variations.id变成仅包含原_id的单元素数组,而不是直接替换每个variation对象里的_id为id。
现有聚合代码:
Product.aggregate([ matchObj, {$addFields: { id: "$_id", "variations.id": "$variations._id" }}, {$project: { _id: 0, "variations._id": 0 }} ])
解决方案
之前的写法"variations.id": "$variations._id"会把整个variations数组的所有_id提取成一个新数组,然后赋值给每个variation元素的id字段,这就是问题根源。要处理嵌套数组里的每个对象,需要用$map遍历数组并逐个修改元素。
正确的聚合管道代码如下:
Product.aggregate([ matchObj, { $addFields: { // 处理外层的_id替换为id id: "$_id", // 用$map遍历variations数组,逐个处理每个元素 variations: { $map: { input: "$variations", as: "item", in: { // 保留当前元素的所有字段 ..."$$item", // 添加id字段,值为当前元素的_id id: "$$item._id", // 移除当前元素的_id字段 _id: "$$REMOVE" } } } } }, { $project: { // 移除外层的_id _id: 0 } } ])
代码说明
$map遍历variations数组,每个元素用$$item指代- 用
...$$item保留原元素的所有字段(比如示例中的some字段) - 添加
id字段并赋值为当前元素的_id - 用
$$REMOVE关键字移除原_id字段 - 外层的
_id替换和移除逻辑保持不变
这样处理后,每个variations数组里的对象都会把_id替换成id,不会出现数组嵌套的问题。
内容的提问来源于stack exchange,提问作者Lee Morgan
相关产品推荐
相关产品推荐

