我正在將一個專案從 Firebase 版本 8 更新到版本 9。我有條件過濾查詢,其結構如下:
let query = db.collection("collectionName").orderBy("timestamp")
if (filters.selectedStaff) {
query = query.where("id", "==", filters.selectedStaff.id);
}
if (filters.selectedStudent) {
query = query.where("studentIDs", "array-contains", filters.selectedStudent.id);
}
然后在每次過濾器更改時重新呈現的鉤子中執行查詢。使用第 8 版,這可以完美運行。
在版本 9 中,查詢現在構建為遵循一種格式,其中每個查詢都作為引數傳遞給查詢函式。一個正常的查詢看起來像:
query(collection(db, "collectionName"), where("id", "==", filters.selectedStaff.id), where("studentIDs", "array-contains", filters.selectedStudent.id), orderBy("timestamp"))
您仍然可以將 where 函式存盤為變數,并將該變數作為引數傳遞給查詢函式:
let w1 = where("id", "==", filters.selectedStaff.id)
let w2 = where("studentIDs", "array-contains", filters.selectedStudent.id)
query(collection(db, "collectionName"), w1, w2, orderBy(timestamp))
但是,我還沒有想出如何解決的問題是如何使 where 子句有條件。firebase 似乎不允許 where 子句值為 any 。例如,使 w1 默認為:
let w1 = where("id", "==", "*")
如果您嘗試使運算子也是一個變數并默認為 == 以外的任何值,例如 != :
let w1 = where("id", "!=", "")
Firebase 強制您按 where 子句中的欄位設定主要排序,如果您嘗試按我這樣的另一個欄位(時間戳)排序,則該欄位將不起作用。
最終,有效的解決方法是在每個檔案中創建一個具有相同值的欄位,例如布爾真值,然后將所有 where 子句設定為最初等于該值,然后動態更改:
let w1 = where("randomField", "==", true)
let w2 = where("randomField", "==", true)
if(filters.selectedStaff){
w1 = where("id", "==", filters.selectedStaff.id)
}
if(filters.selectedStudent){
w2 = where("studentIDs", "array-contains", filters.selectedStudent.id)
}
query(collection(db, "collectionName"), w1, w2, orderBy(timestamp))
雖然這有效,但感覺真的是一種不必要的解決方法,我想看看是否有人知道實作相同結果的更好方法。
uj5u.com熱心網友回復:
您可以繼續使用現有的邏輯,只是語法發生了變化。嘗試重構代碼,如下所示:
let q = query(collection("db", "collectionName"), orderBy("timestamp"));
if (filters.selectedStaff) {
q = query(q, where("id", "==", filters.selectedStaff.id));
}
if (filters.selectedStudent) {
q = query(q, where("studentIDs", "array-contains", filters.selectedStudent.id));
}
const snapshot = await getDocs(q);
另一種方法是有條件地將這些條件推送到陣列中:
const conditions = [orderBy("timestamp")]
if (filters.selectedStaff) {
conditions.push(where("id", "==", filters.selectedStaff.id));
}
if (filters.selectedStudent) {
conditions.push(where("studentIDs", "array-contains", filters.selectedStudent.id));
}
const q = query(collection(db, "collectionName"), ...conditions);
// Do note the spread operator ^
const snapshot = await getDocs(q);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351784.html
標籤:javascript 火力基地 谷歌云firestore
上一篇:ReactJs條件渲染不起作用
