2014-12-19 22 views
10

Ich versuche, eine hexadezimale Zeichenfolge in eine äquivalente ObjectID in einer Aggregationsabfrage zu konvertieren. Ich habe versucht, zwei verschiedene Methoden:MongoDB-Aggregationsprojekt-String zu ObjectId

db.omvas.aggregate([ 
    {$project:{ 
     EID:{$let: { 
       vars: { 
        id: "$EID" 
       }, 
       in: ObjectId("$$id") 
      }}, 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

und

db.omvas.aggregate([ 
    {$project:{ 
     EID: ObjectId("$EID") 
     } 
    }, 
    {$group:{ 
     _id:"$EID" 
     } 
    } 
]); 

Ich erhalte die Fehlermeldung "Fehler: ungültige Objekt-ID: Länge" entweder-Methode. Ich habe das Hinzufügen einer Literal-Zeichenfolge anstelle der Aggregationsvariablen getestet und erhalte ein Ergebnis mit einer richtigen ObjectID. Es scheint, dass der String-Wert nicht an die ObjectId-Funktion von Mongo übergeben wird, sondern dass der Variablenname als Literal-String übergeben wird.

Hat jemand eine Idee, wenn das, was ich zu erreichen versuche, möglich ist? Gibt es Magie, die ich vermisse?

Antwort

3

ist ein Konstruktor für ObjectIds in der Shell. Wenn Sie so etwas wie

"EID" : { "$let" : { 
      "vars" : { "id" : "$EID" }, 
      "in" : ObjectId("$$id") 
     } } 

die Shell wertet ObjectId("$$id") Mongo schreiben, bevor die Aggregation Anfrage senden. Es ist wie wenn Sie eine Funktion in Javascript wie

genannt
var x = 2 
var y = 4 
f(x + y) // f(6) 

Was Sie brauchen, ist eine Aggregation Operator einen String in ein ObjectId zu konvertieren. Leider existiert keine solche Funktion wie in MongoDB 2.6. Warum müssen Sie die Zeichenfolge konvertieren? Was wirst du damit machen? Vielleicht gibt es einen Weg um das Fehlen eines Konvertierungsoperators in Aggregation.

+0

Danke, das macht vollkommen Sinn. Diese bestimmte Abfrage ist nur eine Stufe in einem Berichtsworkflow. Die ObjectId war notwendig, da sie von Abfragen weiter unten in der Pipeline verwendet wird. Ich überlege, wie sie jetzt arbeiten und denke, dass ich sie besser ausführen kann. – StevenWarren

+1

In meinem Fall möchte ich eine '$ lookup' machen, wobei das lokale Feld eine String-Repräsentation einer' ObjectId' ist und das fremde Feld eine tatsächliche 'ObjectId' ist. Irgendeine Idee, wenn das mit MongoDB 3.2 möglich ist? – Madbreaks

+1

Eine Möglichkeit wäre, ein Skript zu schreiben, das den Dokumenten in der Sammlung ein neues Feld hinzufügt, das die ID als ObjectId enthält. Dann führen Sie den $ Lookup mit dem neuen Feld aus. –

Verwandte Themen