【发布时间】:2017-08-29 13:48:43
【问题描述】:
我在一个集合中有以下文档:
输入:
{
"_id" : ObjectId("***"),
"oldItems" : [
{
"_id" : ObjectId("***"),
"name" : "ItemId***",
"nestedItemsToExtract" : { }
}
]
}
我需要遍历 oldItems 数组并使用另一个数组创建一个结果输出文档,其值应从原始数组映射。
输出:
{
"_id" : ObjectId("***"),
"newItems" : [
{
"oldItemId" : "***", // String Value Of Parent's / Mapped Item Id aka ObjectId.toString()
"_id" : ObjectId("***") // New ObjectId Here aka ObjectId()
}
]
}
如何将映射的(旧)_idObjectId 值转换为字符串,但为结果数组中的(新)_id 属性生成新的 ObjectId?
编辑:
我已经设法找到一种解决方法,通过"{ $literal: ObjectId() }" 表达式生成新的 ObjectId 值。我已经更正了我的“输出”代码 sn-p:
use DB_NAME_HERE
db.getCollection('COLLECTION_NAME_HERE').aggregate([
{ $match: {} },
{ $project: {
newItems: {
$map: {
input: '$oldItems',
as: 'oldItem',
in: {
oldItemId: '$$oldItem._id' // Returns ObjectId
_id: ObjectId() // Fails With 'disallowed field type OID in object expression (at '_id')"'
//Edit
//_id: { $literal: ObjectId() } // Works
}
}
}
}
}])
【问题讨论】: