我在一个集合中有以下文档:
输入:
{
"_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()
}
]
}
如何将映射的(旧)_id
ObjectId值转换为String,但为结果数组中的(新)_id
属性生成新的ObjectId?
修改
我设法找到了一种通过"{ $literal: ObjectId() }"
表达式生成新ObjectId值的解决方法。我已更正了我的“输出”代码段:
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
}
}
}
}
}])
答案 0 :(得分:5)
您不能在当前版本的Mongodb(3.4)中的聚合管道中进行从ObjectId到string(或者反vesa)的类型转换。 Mongodb官方错误跟踪器指出这个问题存在一些问题:
SERVER-11400: Need a type conversion mechanism to convert between strings and numbers
SERVER-22781: Allow $lookup between ObjectId (_id.str) and string
SERVER-24947: Need a type conversion mechanism for booleans, ISODates, ObjectID
至于ObjectId生成期间的错误 - 试试这个:
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: { $literal: ObjectId() }
}
}
}
}
}])