Đôi khi khi bạn truy vấn một tập hợp trong MongoDB, bạn có thể không hài lòng với tên trường. Theo mặc định, tên trường chỉ đơn giản là phản ánh tên trường trong tài liệu thực tế.
Có thể tên trường không nhất quán hoặc có lỗi đánh máy. Dù lý do là gì, bạn có thể sử dụng $project
giai đoạn quy trình tổng hợp để đổi tên một trường trong kết quả truy vấn của bạn.
Theo một số cách, điều này có thể so sánh với việc sử dụng bí danh trong SQL, vì nó không đổi tên các trường cơ bản, nó chỉ đổi tên chúng trong kết quả truy vấn.
Ví dụ
Giả sử chúng ta trả về nội dung của một bộ sưu tập như thế này:
db.employees.find()
Kết quả:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Ở đây, chúng tôi sử dụng find()
phương thức để trả về nội dung của bộ sưu tập.
Trong trường hợp này, tên của mỗi trường được trả về trong kết quả.
Nhưng điều gì sẽ xảy ra nếu chúng ta muốn các tên trường khác nhau? Ví dụ:điều gì sẽ xảy ra nếu chúng ta muốn thay thế name
với employee
?
Trong trường hợp đó, chúng tôi có thể sử dụng aggregate()
để thực hiện một truy vấn như sau:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Kết quả:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Lưu ý rằng MongoDB hiển thị các trường theo thứ tự chèn, dẫn đến salary
trường được hiển thị trước employee
đồng ruộng. Nếu điều đó là không thể chấp nhận được, chúng tôi luôn có thể thay đổi truy vấn thành sau:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Kết quả:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Đổi tên trường trong tài liệu được nhúng
Bạn có thể sử dụng phương pháp tương tự để đổi tên các trường trong tài liệu nhúng. Trong trường hợp này, hãy sử dụng ký hiệu dấu chấm để tham chiếu đến trường bạn muốn đổi tên.
Giả sử chúng ta chạy truy vấn sau đối với pets
bộ sưu tập:
db.pets.find().pretty()
Kết quả:
{ "_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") } }
Chúng tôi có thể đổi tên các trường trên tài liệu nhúng như sau:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Kết quả:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
Trong trường hợp này, tôi không chọn tất cả các trường trong tài liệu được nhúng, nhưng bạn có thể hiểu được.
Tôi cũng đã sử dụng "_id": 0
bỏ qua _id
trường.
Cũng lưu ý rằng nếu một tài liệu thực sự không có trường được chỉ định trong $project
, sau đó nó sẽ đơn giản bị bỏ qua trong tài liệu kết quả. Bạn có thể thấy điều này trong tài liệu đầu tiên, tài liệu này bỏ qua Born
và tài liệu thứ hai, loại bỏ Type
trường.