Mongodb Mongo将字符串数组更新为嵌入对象数组
我的Mongodb Mongo将字符串数组更新为嵌入对象数组,mongodb,Mongodb,我的MongoDB中存储了一些数据。“tags”字段实际上是一个字符串数组,但我们必须更新我们的模型,以使用这些标记存储更多数据 当前模型文档 { "id" : "59e4aefd74f12800019ba565", "title" : "This is a title", "tags" : [ "59b02e6f6b28ce0001f8c0a8", "59b031886b28ce0001f8c0af", "59ba8
MongoDB
中存储了一些数据。“tags”字段实际上是一个字符串数组
,但我们必须更新我们的模型,以使用这些标记存储更多数据
当前模型文档
{
"id" : "59e4aefd74f12800019ba565",
"title" : "This is a title",
"tags" : [
"59b02e6f6b28ce0001f8c0a8",
"59b031886b28ce0001f8c0af",
"59ba8c1a5047570001a3c078"
]
}
更新后的所需模型
{
"id" : "59e4aefd74f12800019ba565",
"title" : "This is a title",
"tags" : [
{
"id" : "5a82ff1d889a15000103b115",
"internalName" : "Día Mundial de la Television"
},
{
"id" : "59ba8c1a5047570001a3c078",
"internalName" : "menu"
},
{
"id" : "5a26ac73d0fc2e00017f286e",
"internalName" : "oid_asdf_asd"
}
],
}
现在标记是一个嵌入对象(忘记internalName字段)。如何更新标记字段而不丢失这些数据?我尝试过$rename,但它在数组中不起作用
db.test.update({}, {$rename: {'tags': 'tags2.id'}})
使用本文中的概念,您可以从聚合操作创建一个游标,该聚合操作通过使用操作符转换标记数组,迭代游标并使用更新集合。 聚合操作如下所示:
var cursor = db.test.aggregate([
{
"$project": {
"tags": {
"$map": {
"input": "$tags",
"as": "el",
"in": {
"id": "$$el",
"internalName": { "$literal": "temp string" }
}
}
}
}
}
]);
并运行批量更新:
var bulkUpdateOps = [];
cursor.forEach(doc => {
const { _id, tags } = doc;
bulkUpdateOps.push({
"updateOne": {
"filter": { _id },
"update": { "$set": { tags } },
"upsert": true
}
});
if (bulkUpdateOps.length === 1000) {
db.test.bulkWrite(bulkUpdateOps);
bulkUpdateOps = [];
}
});
if (bulkUpdateOps.length > 0) {
db.test.bulkWrite(bulkUpdateOps);
}
谢谢你的回复。我现在正在测试,但似乎不起作用。(可能是我的错)。我正在试图找出原因。@dragonalvaro我删除的代码中有一个打字错误,再试一次它是否有效!非常感谢你。我真的很感谢您的时间。只需再更正一次,将第一个if条件检查移动到forEach循环中,以使其正常工作,即以1000个批次执行批量更新。我更新了我的答案以反映这一点。