在Mongo中,克隆并重命名一个子文档数组的字段。

9 浏览
0 Comments

在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`方法实现预期结果?

0
0 Comments

问题的出现原因:

在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数据库中克隆和重命名子文档数组的字段,并保留原始集合的结构。

0