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
}
}
}
}
}])
対応するバグ/リクエストへのリンクを提供していただき、ありがとうございます。私は "{$ literal:ObjectId()}"式で新しいObjectId値を生成するための回避策を見つけることができました。私は私の "出力"コードスニペットを修正しました。あなたの答えの "_id:new ObjectId()"式もうまく動作せず、同じエラーが発生します( ''id' 'のオブジェクト式でOIDが許可されていません)。 – Mikhail
あなたの回避策に応じて回答を修正しましたが、それでもあなたのケースではうまくいかない理由を理解できません。以前は似たようなケースがありましたが、うまくいきました。 –