在MongoDB聚合映射中将ObjectId转换为String,反之亦然

时间:2017-04-04 11:26:42

标签: mongodb robo3t

我在一个集合中有以下文档:

输入:

{
    "_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
                }
            }
        }       
    }
}])

1 个答案:

答案 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() }
                }
            }
        }       
    }
}])