I haben das folgende Dokument in einer Sammlung:Convert ObjectId zu String und vice versa innen MongoDB aggregierte Karte
Input:
{
"_id" : ObjectId("***"),
"oldItems" : [
{
"_id" : ObjectId("***"),
"name" : "ItemId***",
"nestedItemsToExtract" : { }
}
]
}
Ich muss durch die oldItems
Array iterieren und ein resultierendes erstellen Ausgabedokument mit einem anderen Array, dessen Werte von dem ursprünglichen Array zugeordnet werden sollen.
Ausgang:
{
"_id" : ObjectId("***"),
"newItems" : [
{
"oldItemId" : "***", // String Value Of Parent's/Mapped Item Id aka ObjectId.toString()
"_id" : ObjectId("***") // New ObjectId Here aka ObjectId()
}
]
}
Wie die abgebildete (alt) _id
ObjectId Wert in einen String konvertieren, sondern eine neue ObjectId für die (neu) _id
Eigenschaft im resultierenden Array erzeugen?
Edit:
Ich habe es geschaffen, einen neuen ObjectId Wert über den "{ $literal: ObjectId() }"
Ausdruck eine Abhilfe finden zu erzeugen. Ich habe meinen "Output" Code-Snippet korrigiert:
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
}
}
}
}
}])
Vielen Dank für die Bereitstellung von Links zu entsprechenden Fehlern/Anfragen. Es ist mir gelungen, einen Workaround zu finden, um einen neuen ObjectId-Wert über den Ausdruck "{$ Literal: ObjectId()}" zu generieren. Ich habe mein Code-Snippet "Ausgabe" korrigiert. Der Ausdruck "_id: new ObjectId()" aus Ihrer Antwort funktioniert ebenfalls nicht und erzeugt den gleichen Fehler ('unzulässige Feldtyp-OID im Objektausdruck (bei' _id ')' '). Bitte korrigieren Sie Ihren Code-Snippet entsprechend meiner Änderungen , damit ich deine Antwort annehmen kann. – Mikhail
Ich habe meine Antwort entsprechend Ihrer Problemumgehung korrigiert. Aber ich kann immer noch nicht verstehen, warum es in Ihrem Fall nicht funktioniert. Ich hatte vor einiger Zeit einen ähnlichen Fall und es hat gut funktioniert . –