MongoDB 4.0 menambahkan $convert
operator agregasi dan $toString
alias yang memungkinkan Anda melakukan hal itu:
db.getCollection('example').aggregate([
{ "$match": { "example":1 } },
{ "$project": { "_id": { "$toString": "$_id" } } }
])
Penggunaan utama kemungkinan besar adalah menggunakan _id
nilai sebagai "kunci" dalam dokumen.
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"] }
}
}
}
}]
]
}
}}
])
Yang akan kembali:
{
"5b06973e7f859c325db150fd" : { "a" : 1, "b" : 2 }
}
Yang dengan jelas menunjukkan string, seperti halnya contoh lainnya.
Umumnya meskipun biasanya ada cara untuk melakukan "transformasi" pada kursor saat dokumen dikembalikan dari server. Ini biasanya merupakan hal yang baik karena ObjectId
adalah representasi biner 12-byte sebagai lawan dari "string" hex 24 karakter yang membutuhkan lebih banyak ruang.
Shell memiliki .map()
metode
db.getCollection('example').find().map(d => Object.assign(d, { _id: d._id.valueOf() }) )
Dan NodeJS memiliki Cursor.map()
yang dapat melakukan banyak hal yang sama:
let cursor = db.collection('example').find()
.map(( _id, ...d }) => ({ _id: _id.toString(), ...d }));
while ( await cursor.hasNext() ) {
let doc = cursor.next();
// do something
})
Dan metode yang sama juga ada di driver lain (tidak hanya PHP ), atau Anda bisa mengulangi kursor dan mengubah konten seperti yang mungkin merupakan hal terbaik untuk dilakukan.
Faktanya, seluruh hasil kursor dapat direduksi menjadi satu objek dengan sangat mudah hanya dengan menambahkan pernyataan pengembalian kursor, saat bekerja di shell
.toArray().reduce((o,e) => {
var _id = e._id;
delete e._id;
return Object.assign(o, { [_id]: e })
},{ })
Atau untuk lingkungan pendukung JavaScript ES6 lengkap seperti nodejs:
.toArray().reduce((o,({ _id, ...e })) => ({ ...o, [_id]: e }),{ })
Hal-hal yang sangat sederhana tanpa kerumitan apa yang perlu diproses dalam kerangka agregasi. Dan sangat mungkin dalam bahasa apa pun dengan cara yang hampir sama.