如何在 MongoDB 中重组 collection

How to restructure a collection in MongoDB

我正在寻求重组我的 MongoDB collection 但没能成功。我对此很陌生,正在寻求帮助。我正在努力访问“itemsList”字段中的移动数据。

我的 collection 文档目前的结构如下:

{
  "_id": 1,
  "pageName": "List of Fruit",
  "itemsList":[
    {
      "myID": 101,
      "itemName": "Apple"
    },
    {
      "myID": 102,
      "itemName": "Orange"
    }
  ]
},
{
  "_id": 2,
  "pageName": "List of Computers",
  "itemsList":[
    {
      "myID": 201,
      "itemName": "MacBook"
    },
    {
      "myID": 202,
      "itemName": "Desktop"
    }
  ]
}

最终结果

但我希望对数据进行重组,以便“itemName”的值是它自己的文档。

我也想把“myID”的名字改成“itemID”。

并将新文档保存到另一个collection。

{
  "_id": 1,
  "itemName": "Apple",
  "itemID": 101,
  "pageName": "List of Fruit"
},
{
  "_id": 2,
  "itemName": "Orange",
  "itemID": 102,
  "pageName": "List of Fruit"
},
{
  "_id": 3,
  "itemName": "MacBook",
  "itemID": 201,
  "pageName": "List of Computers"
},
{
  "_id": 4,
  "itemName": "Desktop",
  "itemID": 202,
  "pageName": "List of Computers"
}

我试过的

我曾尝试使用 MongoDB 的聚合功能,但由于每个文档中有多个“itemName”字段,它会将它们都添加到一个数组中 - 而不是每个文档中一个。

db.collection.aggregate([
  {$Project:{
    itemName: "$itemsList.itemName",
    itemID: "$itemsList.otherID",
    pageName: "$pageName"
  }},
  {$out: "myNewCollection"}
])

我也试过使用 PyMongo 3.x 遍历文档的字段并另存为新文档,但没有成功。

实现方法

我愿意使用 MongoDB 的聚合功能,如果它可以将这些项目移动到它们自己的文档,或 Python 脚本 (3.x) - 或任何您认为可以提供帮助的其他方法。

在此先感谢您的帮助!

你只需要 $unwind 来“打破”数组。然后你可以做一些数据整理并输出到你的 collection.

请注意,您没有指定 _id 的确切要求。您可能需要进行额外处理。下面的演示使用本机 _id 生成,它将自动分配 ObjectIds。

db.collection.aggregate([
  {
    "$unwind": "$itemsList"
  },
  {
    "$project": {
      "_id": 0,
      "itemName": "$itemsList.itemName",
      "itemID": "$itemsList.myID",
      "pageName": "$pageName"
    }
  },
  {
    $out: "myNewCollection"
  }
])

这里是Mongo playground供您参考。