2017-04-04 3 views
3

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 
       } 
      } 
     }  
    } 
}]) 

Antwort

5

Sie können keine Typumwandlung von ObjectId bespannen (oder umge vesa) in einer Aggregationsrohrleitung in der aktuellen Version von MongoDB (3.4) tun. Es gibt einige Probleme auf MongoDB offiziellen Tracker Bug zu diesem Problem zeigt:

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

Wie für einen Fehler während ObjectId Generation - versuchen Sie dies:

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

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

+0

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 . –

Verwandte Themen