[英]How to show a multiple fields of documents in Firestore in one row of LazyColumn
[英]How to search in Firestore using multiple fields of documents for android?
我正在為 android 使用 Firebase Firestore 來存儲數據。 我試圖從文檔中搜索數據。
我的 Firestore 結構是:
集合(產品)- 文檔(自動生成的 ID)- 字段(NumberOfPeople、OfferStartDate、OfferEndDate、OfferPrice、Location)
我寫了關於這些字段的搜索數據的查詢。
CollectionReference collectionOfProducts = db.collection("Products");
collectionOfProducts
.whereEqualTo("Location", location)
.whereGreaterThanOrEqualTo("OfferPrice", offerPrice)
.whereLessThanOrEqualTo("OfferPrice", offerPrice)
.whereGreaterThanOrEqualTo("OfferStartDate", date)
.whereLessThanOrEqualTo("OfferEndDate", date)
.get()
我想要這樣的搜索結果:開始日期和結束日期之間的報價,報價大於等於或小於給定價格范圍內的報價。 此查詢在 android 工作室中不起作用。
如何在 firestore firebase 中執行此操作?
據我所知,Firestore 只允許您使用 where<Greater/Less>ThanOrEqualTo() 和 where<Greater/Less>Than() 單個字段,其他字段上的所有其他過濾操作只能是 whereEqualTo()。
針對您的特定情況的一些解決方法包括 -
1)將您的查詢修改為
collectionOfProducts
.whereGreaterThanOrEqualTo("OfferStartDate", date)
.whereEqualTo("Location", location)
.get()
然后在您的應用程序代碼中對結果執行后續過濾。
或者,您可以對查詢中的“OfferPrice”和“Location”執行過濾器,其余過濾器可應用於查詢結果。
2) 您可以使用firebase 函數或其他服務器代碼來編寫執行自定義過濾並以這種方式獲取結果的邏輯。
我對此有同樣的問題,但我發現了一個需要花費一些時間來編寫的解決方法。
假設您要搜索特定關鍵字(在本例中為文檔中字段的值),並且您希望 firebase 搜索多個字段而不是僅查找 1 個特定字段。
這就是你想要做的。
const searchTerm = document.createElement('input')
db.collection('collection').where('field1', '==', `${searchTerm.value}`)
.get()
.then((snapshot) => {
if(snapshot.size === '0'){
db.collection('collection').where('field2', '==', `${searchTerm.value}`)
.get()
.then((snapshot) => {
if(snapshot.size === 0) {
db.collection......and repeat
}
})
}
})
綜上所述,上面的代碼基本上是告訴 js 如果上一個查詢的結果為 0,則使用不同的字段再次搜索術語。我知道如果我們有大量字段,這個解決方案可能無法工作。 但是對於那些處理少量字段的人來說,這個解決方案可能會有所幫助。
我真的希望有一天 firestore 會允許這樣的功能,但這是對我來說效果很好的代碼。
我現在遇到的問題是允許搜索輸入能夠在沒有我完成單詞的情況下進行搜索。 我目前確實知道這是怎么回事,但只需要一些時間來整理。
根據有關 Cloud Firestore 查詢的官方文檔,請注意存在一些查詢限制:
在復合查詢中,范圍 (<, <=, >, >=) 和不等於 (!=, not-in) 比較都必須在同一字段上進行過濾。
因此,包含對這兩種方法的調用的 Query 對象:
.whereGreaterThanOrEqualTo("OfferStartDate", date)
.whereLessThanOrEqualTo("OfferEndDate", date)
實際上是不可能的,因為“OfferStartDate”和“OfferEndDate”是不同的屬性。
我能想到的最佳解決方案是僅使用這些方法調用中的一個,並在客戶端上進行其他過濾。
另一種可能的解決方案可能是使用非規范化並以特定時間間隔復制數據。 通過這種方式,您將始終知道時間段,並且您將能夠創建相應的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.