MongoDB文档嵌套数组更新:ObjectId数组转字符串数组
问题:将MongoDB嵌套数组中的ObjectId转换为字符串数组
原始数据
{ "_id" : ObjectId("5d7e6c54c23c210001108556"), "parentId" : "5d0162ba69cf130001a16115", "tasks" : [ { "_id" : "ae60a8f1", "taskMetaDataIds" : [ ObjectId("5d55a648e2f7320001e578ac") ], "name" : "meta 3" }, { "_id" : "07544d96", "taskMetaDataIds" : [ ObjectId("5d55a648e2f732676676676"), ObjectId("5d55a648e2612333556888") ], "name" : "meta 2" } ], "name" : "New Topic", "createdBy" : "01526151-8303-450f-b08b-b36a1760b774", "createdDate" : ISODate("2019-09-15T16:52:36.150+0000"), "updatedDate" : ISODate("2019-09-15T16:52:36.150+0000") }
期望输出
{ "_id" : ObjectId("5d7e6c54c23c210001108556"), "parentId" : "5d0162ba69cf130001a16115", "tasks" : [ { "_id" : "ae60a8f1", "taskMetaDataIds" : [ "5d55a648e2f7320001e578ac" ], "name" : "meta 3" }, { "_id" : "07544d96", "taskMetaDataIds" : [ "5d55a648e2f732676676676", "5d55a648e2612333556888" ], "name" : "meta 2" } ], "name" : "New Topic", "createdBy" : "01526151-8303-450f-b08b-b36a1760b774", "createdDate" : ISODate("2019-09-15T16:52:36.150+0000"), "updatedDate" : ISODate("2019-09-15T16:52:36.150+0000") }
无效尝试
db.getCollection("data").updateOne({"_id":ObjectId("5d7e6c54c23c210001108556")}, [{ $set: { "tasks.taskMetaDataIds": "$tasks.taskMetaDataIds.str" } }])
解决方案
使用MongoDB聚合管道的$map操作符遍历嵌套数组,结合$toString将ObjectId转换为字符串,完整更新语句如下:
db.getCollection("data").updateOne( {"_id": ObjectId("5d7e6c54c23c210001108556")}, [ { $set: { tasks: { $map: { input: "$tasks", as: "task", in: { _id: "$$task._id", name: "$$task.name", taskMetaDataIds: { $map: { input: "$$task.taskMetaDataIds", as: "metaId", in: {$toString: "$$metaId"} } } } } } } } ] )
说明
- 外层
$map遍历tasks数组,对每个任务对象重新构造内容 - 内层
$map遍历每个任务的taskMetaDataIds数组,用$toString将每个ObjectId转换为对应的字符串形式 - 该方案基于MongoDB 4.2+版本支持的聚合管道更新语法,可直接通过原生操作符完成转换,无需脚本循环
内容的提问来源于stack exchange,提问作者Tech_Dev
相关产品推荐
相关产品推荐

