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.???'}}])
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.???'}}])
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
Puoi farlo in linea utilizzando l'operatore $concat
:
db.something.aggregate(
[
{ $match :
{ 'property' :
{ $exists:true }
}
},
{ $project:
{ stringId:
{ $concat: [ ObjectId().str ] }
}
}
]
)
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
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. –
@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
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. –