在Mongo中,克隆并重命名一个子文档数组的字段。
在Mongo中,克隆并重命名一个子文档数组的字段。
我有一个类似这样的集合:
{ name: "A Name", answers: [ {order: 1}, {order: 2}, {order: 3} ] }
我想要做的是根据`order`属性的值为`answers`数组的每个元素添加一个新字段`id`,我只想要复制它,所以输出结果如下:
{ name: "A Name", answers: [ {order: 1, id: 1}, {order: 2, id: 2}, {order: 3, id: 3} ] }
我看了这篇帖子和这篇帖子,但我不知道如何将它们结合起来正确地处理子文档。
在MongoDB的`aggregate`方法的文档中,我找到了一个简单的例子,说明如何更新嵌入式文档,在这里,但我不知道如何使用`order`属性代替固定的术语。以下尝试似乎不符合我的需求:
db.collection.aggregate([ { $addFields: { "answers.id": "answers.$.order" } } ]) db.collection.aggregate([ { $addFields: { "answers.id": "$answers.order" } } ])
是否可以使用`aggregate`方法实现预期结果?
问题的出现原因:
在Mongo数据库中,有一个包含子文档数组的集合。现在需要对该集合中的每个子文档的字段进行克隆和重命名。但是,由于集合中还存在其他字段(如姓名、姓氏、标题等),需要保留原始集合的结构,并仅在嵌入文档中添加一个额外字段。因此,需要找到一种解决方法来实现这个需求。
解决方法:
为了解决这个问题,可以使用Mongo的聚合框架来处理集合。下面是几种不同的解决方法:
1. 使用$set和$map操作符:
使用$set操作符和$map操作符来克隆和重命名子文档数组中的字段。以下是示例代码:
db.collection.aggregate([ { $set: { answers: { $map: { input: "$answers", as: "answer", in: { $mergeObjects: [ "$$answer", { id: "$$answer.order" } ] } } } } } ])
2. 使用$unwind和$group操作符:
使用$unwind操作符将子文档数组展开为独立的文档,并使用$group操作符将它们重新组合。以下是示例代码:
db.collection.aggregate([
{ $unwind: "$answers" },
{
$group: {
_id: "$_id",
answers: { $push: { order: "$answers.order", id: "$answers.order" } },
name: { $first: "$name" }
}
}
])
3. 使用$unwind、$addFields和$group操作符:
使用$unwind操作符将子文档数组展开为独立的文档,使用$addFields操作符将字段的值复制到新的字段,并使用$group操作符将它们重新组合。以下是示例代码:
db.collection.aggregate([ { $unwind: "$answers" }, { $addFields: { "answers.id": "$answers.order" } }, { $group: { _id: "$_id", answers: { $push: "$answers" } } } ])
4. 如果需要根据索引对结果进行排序并获取id:
使用$sort操作符根据字段的顺序进行排序,然后使用$unwind和$group操作符来获取索引并生成id。以下是示例代码:
db.collection.aggregate([
{ $sort: { "answers.order": 1 } },
{ $unwind: { path: "$answers", includeArrayIndex: "index" } },
{ $group: { _id: "$_id", answers: { "$push": { order: "$answers.order", id: { $add: [ "$index", 1 ] } } } } }
])
通过使用上述不同的解决方法,可以根据具体需求选择最适合的方法。这些方法可以帮助在Mongo数据库中克隆和重命名子文档数组的字段,并保留原始集合的结构。