簡體   English   中英

在 FireStore 中過濾集合組查詢

[英]Filter a collection group query in FireStore

我有一個如下的數據庫結構(為了這個問題而簡化):

Collection: item_A
    -> Document: params = {someParameter: "value"}
    -> Document: user_01
        -> Sub-collection: orders_item_A
            -> Document: order_AA = {type: "A1", address: {pincode: "000000", city:"Paris"}
            -> Document: order_AB = {type: "A2", address: {pincode: "111111", city:"London"}
            ...
    -> Document: user_02
        -> Sub-collection: orders_item_A
            -> Document: order_AC = {type: "A1", address: {pincode: "222222", city:"Berlin"}
            -> Document: order_AD = {type: "A1", address: {pincode: "333333", city:"Paris"}
            ...

我正在使用集合組查詢來檢索“item_A”下的所有訂單(跨所有用戶)。 我可以通過以下方式使其工作:

let orders = [];
await firestore()
    .collectionGroup("orders_item_A")
    .get()
    .then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
            console.log(doc.id, ' => ', doc.data());
            orders.push(doc.data());
        });
    })

但現在我需要改進上述內容,以便能夠過濾來自特定城市(例如巴黎)的訂單。 所以我嘗試添加一個“where”子句,如下所示:

let orders = [];
await firestore()
    .collectionGroup("orders_item_A")
    .where("address.city", "==", "Paris")
    .get()
    .then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
            console.log(doc.id, ' => ', doc.data());
            orders.push(doc.data());
        });
    })

但這失敗了,我收到以下消息:

錯誤:[錯誤:[firestore/failed-precondition] 操作被拒絕,因為系統不在操作執行所需的 state 中。 確保您的查詢已通過 Firebase 控制台編入索引。]

我已經在我的 FireStore 數據庫上設置了一個復合索引,其中包含以下詳細信息:

集合 ID = orders_item_A

Fields indexed = address.city 升序類型 升序

狀態 = 啟用

我不確定我做錯了什么。 我想知道問題是否在於在“where”子句中使用 object 屬性( 這應該不是問題)。 所以我還用一個更簡單的查詢進行了測試,例如:

.where("type", "==", "A1")

但這也失敗了。 我究竟做錯了什么?

我解決了這個問題。 我的錯誤顯然是制作了一個“復合”索引(正如我在問題中提到的那樣),因為它是單擊“索引”的打開頁面。 我應該創建一個“單字段”索引:

在此處輸入圖像描述

刪除我現有的復合索引后,我創建了一個新的“單字段”索引,詳細信息如下:

在此處輸入圖像描述

單擊“下一步”,然后在下一個屏幕上,“啟用”“集合組范圍”下的選項之一(我選擇了升序):

在此處輸入圖像描述

執行上述操作很重要,否則查詢將不起作用。 然后一切都按預期工作,使用我的原始代碼:

let orders = [];
await firestore()
    .collectionGroup("orders_item_A")
    .where("address.city", "==", "Paris")
    .get()
    .then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
            console.log(doc.id, ' => ', doc.data());
            orders.push(doc.data());
        });
    })

注意:如果您碰巧刪除了特定的“索引”,則需要一些時間(在某些情況下最多 10 分鍾)才能准備好。 在此期間,如果嘗試為同一條目創建索引,您將收到錯誤消息。 所以請稍等,過一段時間再試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM