MongoDB 4.0 dodaje $convert
operator agregacji i $toString
alias, który pozwala dokładnie to zrobić:
db.getCollection('example').aggregate([
{ "$match": { "example":1 } },
{ "$project": { "_id": { "$toString": "$_id" } } }
])
Głównym zastosowaniem byłoby najprawdopodobniej użycie _id
wartość jako „klucz” w dokumencie.
db.getCollection('example').insertOne({ "a": 1, "b": 2 })
db.getCollection('example').aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": [
[{
"k": { "$toString": "$_id" },
"v": {
"$arrayToObject": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"cond": { "$ne": ["$$this.k", "_id"] }
}
}
}
}]
]
}
}}
])
Który zwróci:
{
"5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}
Co wyraźnie pokazuje ciąg, podobnie jak drugi przykład.
Ogólnie rzecz biorąc, zazwyczaj istnieje sposób na wykonanie "przekształceń" na kursorze, gdy dokumenty są zwracane z serwera. Zwykle jest to dobre, ponieważ ObjectId
jest 12-bajtową reprezentacją binarną w przeciwieństwie do 24-znakowego „łańcucha” w systemie szesnastkowym, który zajmuje dużo więcej miejsca.
Powłoka ma .map()
metoda
db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
NodeJS ma Cursor.map()
które mogą zrobić to samo:
let cursor = db.collection('example').find()
.map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
while ( await cursor.hasNext() ) {
let doc = cursor.next();
// do something
})
Ta sama metoda istnieje również w innych sterownikach (ale nie w PHP) lub możesz po prostu iterować kursor i przekształcać zawartość, co jest prawdopodobnie najlepszą rzeczą do zrobienia.
W rzeczywistości, całe wyniki kursora można z łatwością zredukować do jednego obiektu, po prostu dodając do dowolnej instrukcji zwracającej kursor podczas pracy w powłoce
.toArray().reduce((o,e) => {
var _id = e._id;
delete e._id;
return Object.assign(o, { [_id]: e })
},{ })
Lub dla środowisk obsługujących język ES6 JavaScript, takich jak nodejs:
.toArray().reduce((o,({ _id, ...e })) => ({ ...o, [_id]: e }),{ })
Naprawdę proste rzeczy bez złożoności tego, co należy przetworzyć w ramach agregacji. I bardzo możliwe w każdym języku w ten sam sposób.