OrderByChild ฉบับเข้าใจง่าย

เวลาที่เราจะ query ข้อมูลใน Real-time Database ของ Firebase, OrderByChild จะเป็นคำสั่งแรก ๆ ที่ใช้บ่อย หลายคนอาจจะงงว่ามันทำงานยังไง วันนี้ผมจะมาอธิบายการทำงานของ OrderByChild แบบเข้าใจง่าย ๆ ให้ฟังครับ

ลองดูตัวอย่างข้อมูลนี้นะครับ
(https://dinosaur-facts.firebaseio.com/dinosaurs.json)

{
"bruhathkayosaurus": {
"appeared": -70000000,
"height": 25,
"length": 44,
"order": "saurischia",
"vanished": -70000000,
"weight": 135000
},
"lambeosaurus": {
"appeared": -76000000,
"height": 2.1,
"length": 12.5,
"order": "ornithischia",
"vanished": -75000000,
"weight": 5000
},
"linhenykus": {
"appeared": -85000000,
"height": 0.6,
"length": 1,
"order": "theropoda",
"vanished": -75000000,
"weight": 3
},
"pterodactyl": {
"appeared": -150000000,
"height": 0.6,
"length": 0.8,
"order": "pterosauria",
"vanished": -148500000,
"weight": 2
},
"stegosaurus": {
"appeared": -155000000,
"height": 4,
"length": 9,
"order": "ornithischia",
"vanished": -150000000,
"weight": 2500
},
"triceratops": {
"appeared": -68000000,
"height": 3,
"length": 8,
"order": "ornithischia",
"vanished": -66000000,
"weight": 11000
}
}

เมื่อเราลองใช้คำสั่ง

firebase.database().ref('dinosaurs')
.orderByChild('height')
.equalTo(2.1)

จะได้ผลลัพท์เป็น lambeosaurus

คราวนี้เราลองเขียนคำสั่งนี้กับ lodash บ้าง

_.groupBy(dinosaurs, 'height')[2.1]

เราก็จะได้ lambeosaurus เหมือนกัน

แล้วคำสั่งอื่นหล่ะ ?

firebase.database().ref('dinosaurs')
.orderByChild('height')
.startAt(2)
.endAt(6)

ลองเทียบกับ lodash ดู

_(dinosaurs)
.groupBy('height')
.filter((value, key) => key >= 2) // startAt(2)
.filter((value, key) => key <= 6) // endAt(6)
.value()

จะเห็นว่าได้คำตอบเหมือนกันเลย (ตำแหน่งอาจจะต่างกัน เนื่องจาก Firebase จะ order จาก key อีกที)


ดังนั้น ถ้าจะให้เทียบ OrderByChild ก็คล้าย ๆ กับ groupBy นั้นเอง แต่ผลลัพท์จะต่างกันตรงที่ Firebase จะให้ Object กลับมา ส่วน lodash จะให้มาเป็น array

Like what you read? Give acoshift a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.