我有一个这样的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
更新为新的
答案 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()遍历对象的所有键
如果字段是_id:替换为新的_id
如果字段是对象,请在字段本身上调用递归函数。
如果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();
})