更改MongoDB文档/对象中的所有MongoDB对象ID

时间:2019-07-12 10:37:17

标签: javascript node.js mongodb mongoose

我有一个这样的MongoDB对象:

  _id: 5d285b1b05765e16e843136f
  projectName: 'XXX'
  projectType: 'XX',
  projectAlternatives:
  [ { _id: 5ccc5f66c4ae03001706a5a4,
       alternativeActors: [
       {_id: ...},{_id: ...}]
     ,},
    { ...},
  ],
  projectActors:
  [ { _id: 5ccc5fa1c4ae03001706a5a9,
       ... },
    { _id: 5ccc5fa6c4ae03001706a5af,
       ...},
  ]
  ...

我想复制此对象并保存在数据库中。所以我必须将所有的ObjectID更改为一个新的。

我用过

object._id = new mongoose.Types.ObjectId()
object.isNew = true

以更新_id,但是,它只能更新主文档的ObjectID。嵌套的对象数组更多,每个子文档的objectID也需要更改。

那么我该如何将所有ObjectID _id更新为新的

3 个答案:

答案 0 :(得分:1)

您可以在下面的行中使用

_id:{type:Schema.Types.ObjectId,默认值:new ObjectID()}

在子文档架构中

答案 1 :(得分:0)

您可以先循环每个对象,仅将用户ID更改为新的对象ID。因此,考虑对象数组可以执行以下操作:

someArray.forEach((user) => {
 delete user._id;
})

db.collection.insertMany(someArray);

在执行此操作时,请紧记“同步与异步”。

答案 2 :(得分:0)

您可以使用递归函数来实现此目的。对于每个对象,请检查其所有字段的类型。

使用Object.keys()遍历对象的所有键

  1. 如果字段是_id:替换为新的_id

  2. 如果字段是对象,请在字段本身上调用递归函数。

  3. 如果field是一个数组:对其所有元素调用递归函数。

尝试一下:

function replaceObjectIds(object){
    //check if its an object
    if(typeof object === 'object'){

        Object.keys(object).forEach(key => {
            //if object[key] is an array 
            if (Array.isArray(object[key]){
                object[key] = object[key].map(obj =>{
                    return replaceObjectIds(obj);
                })
            }
            //if object[key] is an object 
            else if (typeof object[key] === 'object'){
                object[key] = replaceObjectIds(object[key])
            }
            //if object[key] is an ObjectId,  replace it 
            else if(key == _id){
                object._id = new mongoose.Types.ObjectId()
            }
        })
    }
    return object;
}

//call this function for every document of your collection, and save it
db.collection_name.find({}).forEach(doc => {
    doc = replaceObjectIds(doc)
    doc.save();
})