2016-03-17 22 views
13

Esiste un operatore che potrei utilizzare nella funzione aggregata per ottenere una stringa invece di ObjectId in risposta?

db.something.aggregate([ {$match: {'property': {$exists:true}} }, {$project: {stringId: '$_id.???'}}]) 
+2

No non c'è. Il framework di aggregazione non rigenera alcun tipo di dati (tranne la stringa da numerico tramite '$ substr' e numerico da Data o Data a numerico è fondamentalmente possibile con l'inganno). Perché dovresti pensare che sia comunque necessario? È abbastanza semplice in molte lingue scrivere comunque il valore 'ObjectId' come una stringa. –

+1

@BlakesSeven C'è sempre il motivo :) A causa della semplicità. Ovviamente puoi postarlo. Ma sarebbe bello se potessi semplicemente passare il risultato ad un altro servizio/partito che richiede una stringa semplice. ... – matus

+1

Bene come ho detto, con la maggior parte delle lingue il BSON è appena lanciato su tipi locali. E per "la maggior parte" delle lingue, non c'è assolutamente bisogno di un semplice output come stringa. Personalmente preferisco il formato di output JSON esteso i.e '{" $ oid ":" 56ea9e8bb1e015d13b376db5 "}' dal momento che almeno consente a un client remoto di sapere che i dati sono effettivamente un 'ObjectId' in modo che possa analizzare e trasmettere correttamente se stesso. Questa è una buona cosa, soprattutto considerando che lo spazio di archiviazione è ** metà ** dei byte della lunghezza della stringa. –

risposta

6

Non esiste un Operatore diretto in funzione aggregata per ottenere String da ObjectId.

Dopo la versione 2.6 È possibile utilizzare il metodo ObjectId.toString() per convertire il ObjectId in stringa. Per prima cosa abbini e proietti il ​​tuo ObjectID. Quindi è possibile convertire questo ID oggetto nella stringa utilizzando ObjectID.toString().

db.something.aggregate([{"$match":{'property': {$exists:true}}},{"$project":{"_id":1}}]) 

e quindi utilizzare risultante oggetto e ottenere la stringa come risposta utilizzando ObjectID.tostring()

Edit: è possibile accedere l'attributo str dell'oggetto id utilizzando

ObjectId("507f191e810c19729de860ea").str

fonte: mongodb docs

-11

Puoi farlo in linea utilizzando l'operatore $concat:

db.something.aggregate(
    [ 
     { $match : 
      { 'property' : 
       { $exists:true } 
      } 
     }, 
     { $project: 
      { stringId: 
       { $concat: [ ObjectId().str ] } 
      } 
     } 
    ] 
) 
+0

Per me, questo non rende "stringId" l'ObjectId del record. Lo rende una versione unificata di un nuovo ObjectId. In particolare, è lo stesso valore per tutti i documenti restituiti. Quindi non penso che sia giusto. – mcdave

Problemi correlati