Terkadang saat Anda menanyakan koleksi di MongoDB, Anda mungkin tidak senang dengan nama bidangnya. Secara default, nama bidang hanyalah cerminan dari nama bidang dalam dokumen sebenarnya.
Mungkin nama bidang tidak konsisten, atau ada kesalahan ketik. Apa pun alasannya, Anda dapat menggunakan $project
tahap pipa agregasi untuk mengganti nama bidang dalam hasil kueri Anda.
Dalam beberapa hal, ini sebanding dengan menggunakan alias di SQL, karena tidak mengganti nama bidang yang mendasarinya, ini hanya mengganti namanya di hasil kueri.
Contoh
Misalkan kita mengembalikan isi koleksi seperti ini:
db.employees.find()
Hasil:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Di sini, kami menggunakan find()
metode untuk mengembalikan konten koleksi.
Dalam hal ini, nama masing-masing bidang dikembalikan dalam hasil.
Tapi bagaimana jika kita ingin nama field berbeda? Misalnya, bagaimana jika kita ingin mengganti name
dengan employee
?
Dalam hal ini kita bisa menggunakan aggregate()
metode untuk melakukan kueri seperti ini:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Hasil:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Perhatikan bahwa MongoDB menampilkan bidang dalam urutan penyisipan, yang menghasilkan salary
bidang yang disajikan sebelum employee
bidang. Jika itu tidak dapat diterima, kami selalu dapat mengubah kueri menjadi ini:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Hasil:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Ganti Nama Bidang di Dokumen Tersemat
Anda dapat menggunakan metode yang sama untuk mengganti nama bidang dalam dokumen yang disematkan. Dalam hal ini, gunakan notasi titik untuk merujuk ke bidang yang ingin Anda ganti namanya.
Misalkan kita menjalankan kueri berikut terhadap pets
koleksi:
db.pets.find().pretty()
Hasil:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "Florida Dog Awards" : "Top Dog", "New York Marathon" : "Fastest Dog", "Sumo 2020" : "Biggest Dog" } } } { "_id" : 2, "name" : "Fetch", "details" : { "born" : ISODate("2020-06-22T14:00:00Z"), "color" : "Black" } } { "_id" : 3, "name" : "Scratch", "details" : { "eats" : [ "Mouse Porridge", "Bird Soup", "Caviar" ], "type" : "Cat", "born" : ISODate("2020-12-19T14:00:00Z") } }
Kami dapat mengganti nama bidang pada dokumen yang disematkan seperti ini:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Hasil:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
Dalam hal ini saya tidak memilih semua bidang dalam dokumen yang disematkan, tetapi Anda mengerti.
Saya juga menggunakan "_id": 0
untuk menghilangkan _id
lapangan.
Perhatikan juga bahwa jika dokumen sebenarnya tidak memiliki bidang yang ditentukan dalam $project
tahap, maka itu hanya akan dihilangkan dalam dokumen yang dihasilkan. Anda dapat melihat ini di dokumen pertama, yang menghilangkan tanda Born
bidang, dan dokumen kedua, yang menghilangkan Type
lapangan.