如何在 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供您参考。
我正在寻求重组我的 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供您参考。