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个批次执行批量更新。我更新了我的答案以反映这一点。