2017-04-04 1 views
3

I持って、コレクション内の次の文書:変換はStringにOBJECTIDと、その逆の内側MongoDBの集計マップ

入力:

{ 
    "_id" : ObjectId("***"), 
    "oldItems" : [ 
     { 
      "_id" : ObjectId("***"), 
      "name" : "ItemId***", 
      "nestedItemsToExtract" : { } 
     } 
    ] 
} 

私はoldItems配列を反復処理し、得られたを作成する必要があります出力文書を別の配列で置き換えます。その配列の値は元の配列からマップする必要があります。

出力:文字列にマッピングされた(旧)_idのObjectId値を変換しますが、結果の配列内の(新しい)_idプロパティの新しいのObjectIdを生成する方法

{ 
    "_id" : ObjectId("***"), 
    "newItems" : [ 
     { 
      "oldItemId" : "***", // String Value Of Parent's/Mapped Item Id aka ObjectId.toString() 
      "_id" : ObjectId("***") // New ObjectId Here aka 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

あなたはMongoDBの現在のバージョン(3.4)に集約パイプライン内の文字列(または副VESA)へのObjectIdから型変換を行うことはできません。私は私の「出力」のコードスニペットを修正しています。 その問題を指してMongoDBの公式バグトラッカーにいくつかの問題があります。ObjectIdが生成中にエラーに関しては

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

- これを試してみてください。

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

あなたの回避策に応じて回答を修正しましたが、それでもあなたのケースではうまくいかない理由を理解できません。以前は似たようなケースがありましたが、うまくいきました。 –

関連する問題