【问题标题】:How to restructure a collection in MongoDB如何在 MongoDB 中重组集合
【发布时间】:2021-12-07 02:54:31
【问题描述】:

我正在寻找重组我的 MongoDB 集合,但未能这样做。我对它很陌生,正在寻求帮助。我正在努力访问移动“itemsList”字段中的数据。

我的收藏文档目前的结构如下:

{
  "_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”。

并将新文档保存到另一个集合中。

{
  "_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) - 或您认为可以提供帮助的任何其他方式。

提前感谢您的帮助!

【问题讨论】:

    标签: python mongodb mongodb-query aggregation-framework pymongo


    【解决方案1】:

    您只需要一个$unwind 来“破坏”数组。然后你可以做一些数据整理并输出到你的集合中。

    请注意,由于您没有指定 _id 的确切要求。您可能需要采取额外的处理措施。下面的演示使用原生的_id 生成,它会自动分配ObjectIds。

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

    这里是Mongo playground 供您参考。

    【讨论】:

    • 太棒了,谢谢你的帮助雷!我想我会让 _id 由 MongoDB 自动生成,所以我可能会使用你拥有的方法。另外,感谢游乐场链接 - 我从未见过,将来会使用它!
    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 2012-02-02
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多