[英]Performing a complex query with firestore v9
我正在嘗試使用 firestore v9 執行復雜的查詢。 我的目的是從我的數據結構中獲取一些文檔(跳過和限制)。 我的意思是,我需要從一個文檔中獲取例如 5 個文檔 -> collections -> 文檔。 並且該文檔需要在該日期之前訂購。
因此,例如,假設在我的數組中我包含 2 個文檔 id ['e4z3HNyUCQbiYQRzfVO4RyebMCP2', 'WZImI6tl0IUFKbICEZzcciaUxKG2']
,從這 2 個文檔中,我需要按創建日期排序他們的 userPosts,但我需要傳遞一個跳過也有限制。 因此,從這 2 個文檔中,我將限制獲取 3 個文檔,但是這 3 個文檔將來自我傳遞的 2 個帖子 ID。
const queryBuild = await query(
collection(db, 'posts'),
where('userPosts', 'in', [`post.id`...]),
collection(db, 'userPosts'),
...
);
const querySnapshot = await getDocs(queryBuild);
Firestore 沒有開箱即用的方法可以滿足您的需求。
您將需要發出兩個查詢,一個針對兩個父文檔中的每一個。
例如,假設您總共只需要來自兩個子集合的 3 個文檔。
您首先使用以下查詢查詢第一個子集合:
const q1 = query(collection(db, "posts/e4z3HNyUCQbiYQRzfVO4RyebMCP2/userPosts"), orderBy("creation", "desc"), limit(3));
然后使用以下查詢查詢第二個子集合:
const q2 = query(collection(db, "posts/WZImI6tl0IUFKbICEZzcciaUxKG2/userPosts"), orderBy("creation", "desc"), limit(3));
然后合並兩個結果(即將兩個QuerySnapshot
的文檔推送到一個數組中),按creation
值降序排列並取前三個。
Renaud 的答案的替代方法是將父文檔的postId
存儲在每個userPost
中。 這樣,您可以將in
子句添加到集合組查詢中,以獲取最多 10 個父文檔的用戶帖子。
query(
collectionGroup(db, "userPosts"),
orderBy("creation", "desc"),
where("parentPostId", "in", ["e4z3HNyUCQbiYQRzfVO4RyebMCP2", "WZImI6tl0IUFKbICEZzcciaUxKG2"]),
limit(3)
);
如果您有 10 個以上的 ID,則需要執行多個此類查詢,因此您將回到 Renaud 答案中類似的方法,只是 API 調用次數的 1/10。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.