เมื่อใช้Query API ของ Firebaseคุณอาจถูกลองทำสิ่งนี้:
// !!! THIS WILL NOT WORK !!!
ref
.orderBy('genre')
.startAt('comedy').endAt('comedy')
.orderBy('lead') // !!! THIS LINE WILL RAISE AN ERROR !!!
.startAt('Jack Nicholson').endAt('Jack Nicholson')
.on('value', function(snapshot) {
console.log(snapshot.val());
});
แต่ในฐานะ @RobDiMarco จาก Firebase กล่าวว่าในความคิดเห็น:
การorderBy()
โทรหลายสายจะเกิดข้อผิดพลาด
ดังนั้นรหัสของฉันด้านบนจะไม่ทำงานรหัสของฉันข้างต้นจะไม่ทำงาน
ฉันรู้วิธีการสามอย่างที่จะใช้ได้
1. กรองส่วนใหญ่บนเซิร์ฟเวอร์ทำส่วนที่เหลือบนไคลเอนต์
สิ่งที่คุณสามารถทำได้คือดำเนินการหนึ่งorderBy().startAt()./endAt()
บนเซิร์ฟเวอร์ดึงข้อมูลที่เหลือและตัวกรองที่อยู่ในรหัส JavaScript บนไคลเอนต์ของคุณ
ref
.orderBy('genre')
.equalTo('comedy')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
if (movie.lead == 'Jack Nicholson') {
console.log(movie);
}
});
2. เพิ่มคุณสมบัติที่รวมค่าที่คุณต้องการกรอง
หากยังไม่ดีพอคุณควรพิจารณาแก้ไข / ขยายข้อมูลเพื่อให้สามารถใช้งานได้ ตัวอย่างเช่นคุณสามารถใส่ประเภท + นำไปสู่พร็อพเพอร์ตี้เดียวที่คุณใช้สำหรับตัวกรองนี้
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_lead": "comedy_Jack Nicholson"
},...
คุณกำลังสร้างดัชนีหลายคอลัมน์ของคุณเป็นอย่างนั้นและสามารถสืบค้นด้วย:
ref
.orderBy('genre_lead')
.equalTo('comedy_Jack Nicholson')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
เดวิดตะวันออกได้เขียนห้องสมุดเรียก QueryBase ที่จะช่วยให้มีการสร้างคุณสมบัติดังกล่าว
คุณสามารถทำการสืบค้นแบบสัมพันธ์ / พิสัยสมมติว่าคุณต้องการอนุญาตให้สืบค้นภาพยนตร์ตามหมวดหมู่และปี คุณต้องการใช้โครงสร้างข้อมูลนี้:
"movie1": {
"genre": "comedy",
"name": "As good as it gets",
"lead": "Jack Nicholson",
"genre_year": "comedy_1997"
},...
จากนั้นสอบถามเกี่ยวกับคอเมดี้ของ 90 ด้วย:
ref
.orderBy('genre_year')
.startAt('comedy_1990')
.endAt('comedy_2000')
.on('child_added', function(snapshot) {
var movie = snapshot.val();
console.log(movie);
});
หากคุณจำเป็นต้องกรองมากกว่าเพียงแค่ปีให้แน่ใจว่าจะเพิ่มส่วนวันอื่น ๆ "comedy_1997-12-25"
ในลำดับถัดลงมาเช่น วิธีนี้การเรียงลำดับพจนานุกรมที่ Firebase ทำกับค่าสตริงจะเหมือนกับการเรียงตามลำดับเวลา
การรวมค่าในพร็อพเพอร์ตี้นี้สามารถใช้งานได้มากกว่าสองค่า แต่คุณสามารถทำฟิลเตอร์พิสัยระหว่างค่าสุดท้ายในคุณสมบัติคอมโพสิต
ความแตกต่างที่พิเศษมากของการนี้จะดำเนินการโดยห้องสมุด GeoFire สำหรับ Firebase ห้องสมุดนี้รวมละติจูดและลองจิจูดของตำแหน่งไว้ในGeohash ที่เรียกว่าซึ่งสามารถใช้ในการทำแบบสอบถามแบบเรียลไทม์บน Firebase
3. สร้างดัชนีที่กำหนดเองโดยทางโปรแกรม
อีกทางเลือกหนึ่งคือทำสิ่งที่เราทำเสร็จก่อนที่จะเพิ่ม Query API ใหม่นี้: สร้างดัชนีในโหนดอื่น:
"movies"
// the same structure you have today
"by_genre"
"comedy"
"by_lead"
"Jack Nicholson"
"movie1"
"Jim Carrey"
"movie3"
"Horror"
"by_lead"
"Jack Nicholson"
"movie2"
อาจมีวิธีการเพิ่มเติม ตัวอย่างเช่นคำตอบนี้เน้นดัชนีแบบกำหนดเองรูปต้นไม้ทางเลือก: https://stackoverflow.com/a/34105063
orderBy()
โทรหลายครั้งจะทำให้เกิดข้อผิดพลาดเนื่องจากขณะนี้ลูกค้าให้ผลลัพธ์ที่ไม่คาดคิด อาจเป็นไปได้ว่ามันทำงานโดยบังเอิญในการทดสอบของคุณ แต่ไม่ได้สร้างขึ้นเพื่อทำงานนี้โดยทั่วไป (แม้ว่าเราต้องการเพิ่ม!)