2017-04-04 36 views
3

我有一個集合中的以下文件:轉換的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 
       } 
      } 
     }  
    } 
}]) 

回答

5

您不能從的ObjectId做類型轉換爲字符串(或副VESA)在聚合管道線在當前版本的MongoDB(3.4)。 上有MongoDB的官方bug跟蹤系統的一些問題指向一個問題:

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() } 
       } 
      } 
     }  
    } 
}]) 
+0

感謝您提供指向相應錯誤/請求的鏈接。我設法通過「{$ literal:ObjectId()}」表達式來生成一個新的ObjectId值。我糾正了我的「輸出」代碼片段。你的答案中的「_id:new ObjectId()」表達式不起作用,並生成相同的錯誤('在對象表達式中('_id')''不允許使用字段類型的OID),請根據我的修改更正你的代碼片段,所以我可以接受你的答案 – Mikhail

+0

我已經根據你的解決方法修復了我的答案,但我仍然不明白爲什麼它不適用於你的情況。 。 –

相關問題