亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Firestore 中查詢對象鍵

在 Firestore 中查詢對象鍵

斯蒂芬大帝 2022-06-05 17:00:42
我的 Firestore 查詢技術目前存在一些問題。根據我最近發表的這篇 stackoverflow 帖子,Querying with two array with firestore security rules答案建議將“ids”添加到對象中,鍵為id,值簡單地為“true”。我已經完成了這個,現在我的結構看起來像這樣:這給我留下了這個查詢:db.collection('Depots')  .where(`products.${productId}`, '==', true)  .where(`users.${userId}`, '==', true)  .where('created', '>', 1585998560500)  .orderBy('created', 'asc')  .get();這個查詢讓我拋出一個錯誤,要求創建一個索引:查詢需要索引。您可以在這里創建它:...但是,這會嘗試索引特定的對象鍵,即QXooVYGBIFWKo6Cso products.QXooVYGBIFWKo6C。這當然不是我想要的,因為這個查詢會發生變化,并且可能有無數種可能性,這意味著我必須為每個鍵條目創建另一個索引才能查詢它。有沒有辦法解決這個問題?我假設由于查詢中使用了不同的運算符,它需要索引這個查詢,所以我想知道這個問題是否有任何解決方法。非常感謝您提前。
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

您在這里擁有的是一個地圖字段,通常應該自動為其創建索引。

這確實意味著您將擁有與產品一樣多的索引,這意味著:

  1. 您可以擁有的產品數量受到限制,因為每個文檔最多有 40,000 個索引條目。

  2. 您為每個文檔支付更多費用,因為您為每個索引的存儲付費。

如果這些不是您想要的,您將不得不切換回您的原始模型,并使用您在那里的查詢限制。似乎沒有適合您的兩個要求的解決方案。


查看完整回答
反對 回復 2022-06-05
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

在我們聊天討論之后,這是我建議的起點。誰知道最終架構會是什么樣子,但我認為這個或非常接近這個。您說一個用戶可以同時存在于多個倉庫中,并且多個倉庫可以同時包含相同的產品。您還說過,一個倉庫在給定時間永遠不能擁有超過 40 個用戶,因此 40 個用戶的數組肯定不會侵犯 Firestore 的文檔1,048,576字節限制。


[collection]

    <documentId>

        - field: value


[depots]


    <UUID>

        - depotId: string       "depot456"

        - productCount: num     5,000


    <UUID>

        - depotId: string       "depot789"

        - productCount: num     4,500



[products]


    <UUID>

        - productId: string     "lotion123"

        - depotId: string       "depot456"

        - users: [string]       ["user10", "user27", "user33"]


    <UUID>

        - productId: string     "lotion123"

        - depotId: string       "depot789"

        - users: [string]       ["user10", "user17", "user50"]



[users]


    <userId>

        - depots: [string]      ["depot456", "depot999"]


    <userId>

        - depots: [string]      ["depot333", "depot999"]

在 NoSQL 中,存儲很便宜,并且計算不會像使查詢成為可能和高效(快速且便宜)所需的那樣對數據進行非規范化。


要在單個查詢中查找所有 depot,其中user10和lotion123都為真,請查詢產品集合 where productIdequalsx和usersarray-containsy并從這些結果中收集depotId值。如果您想為其他內容保留數組包含操作,則必須進一步對數據進行非規范化(替換單個用戶的數組)?;蛘?,您可以將此查詢拆分為兩個單獨的查詢。


使用此模型,當用戶離開倉庫時,獲取users數組包含該用戶的所有產品并將其userId從數組中刪除。當用戶加入倉庫時,獲取所有depotId等于的產品x并將其附加userId到數組中。


觀看此視頻以及 Rick 的其他視頻,以深入了解 NoSQL:https ://www.youtube.com/watch?v=HaEPXoXVf2k


查看完整回答
反對 回復 2022-06-05
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

如果您不確定用戶和產品的數量,那么您的數據庫結構似乎不適合這種情況,因為 firestore 文檔存在大小和長度限制。您應該為產品和用戶創建單獨的集合,即規范化您的數據并在產品集合中為用戶提供參考。


User : 

       {

          userId: documentId,

          name: John,

          ...otherInfo

       }


Product : 


       {

          productId: documentId,

          createdBy: userId,

          createdOn:date,

          productName:"exa",

          ...otherInfo

       }

這樣,文檔的大小將受到限制,即如果您不確定大小,請嘗試避免在 firestore 中使用地圖/數組。此外,在這種情況下,查詢的數量會增加,但在這種情況下您不需要很多索引。


查看完整回答
反對 回復 2022-06-05
  • 3 回答
  • 0 關注
  • 177 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號