我有一個集合中的以下文件:轉換的ObjectID爲字符串,並且反之亦然內部MongoDB的聚合地圖
輸入:
{
"_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值轉換爲字符串,但產生的結果數組中的(新)_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
}
}
}
}
}])
感謝您提供指向相應錯誤/請求的鏈接。我設法通過「{$ literal:ObjectId()}」表達式來生成一個新的ObjectId值。我糾正了我的「輸出」代碼片段。你的答案中的「_id:new ObjectId()」表達式不起作用,並生成相同的錯誤('在對象表達式中('_id')''不允許使用字段類型的OID),請根據我的修改更正你的代碼片段,所以我可以接受你的答案 – Mikhail
我已經根據你的解決方法修復了我的答案,但我仍然不明白爲什麼它不適用於你的情況。 。 –