2014-12-19 16 views
10

Sto tentando di convertire una stringa esadecimale nel suo ID oggetto equivalente in una query di aggregazione. Ho provato due diversi metodi:Stringa di progetto di aggregazione MongoDB in ObjectId

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

e

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

continuo a ricevere l'errore "Error: non valida Oggetto ID: lunghezza" utilizzando entrambi i metodi. Ho provato ad aggiungere una stringa letterale al posto della variabile di aggregazione e ottengo un risultato con un ObjectID corretto. Sembra che il valore stringa non sia passato attraverso la funzione ObjectId di Mongo, ma il nome della variabile viene passato come una stringa letterale.

Qualcuno ha qualche idea se quello che sto cercando di realizzare è possibile? C'è qualche magia che mi manca?

risposta

3

ObjectId è un costruttore per ObjectIds nella shell. Quando si scrive qualcosa come

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

shell mongo valuta ObjectId("$$id") prima di inviare la richiesta di aggregazione. E 'proprio come se si chiama una funzione in JavaScript come

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

Quello che vi serve è un operatore di aggregazione per convertire una stringa in un ObjectId. Sfortunatamente, nessuna funzione di questo tipo esiste, a partire da MongoDB 2.6. Perché hai bisogno di convertire la stringa? Cosa ne farai? Forse c'è un modo per aggirare la mancanza di un operatore di conversione in aggregazione.

+0

Grazie, ha perfettamente senso. Questa particolare query è solo una fase di un flusso di lavoro di reporting. L'ObjectId era necessario in quanto viene utilizzato da query più in basso nella pipeline. Sto ripensando a come funzionano ora e penso di avere un modo migliore di eseguirli. – StevenWarren

+1

Nel mio caso voglio fare una '$ ricerca' dove il campo locale è una rappresentazione String di un' ObjectId' e il campo esterno è un 'ObjectId' effettivo. Qualche idea se fosse possibile con MongoDB 3.2? – Madbreaks

+1

Un modo per aggirarlo sarebbe scrivere uno script che aggiunge un nuovo campo contenente l'id come ObjectId ai documenti nella raccolta. Quindi fai la ricerca $ usando il nuovo campo. –

Problemi correlati