簡體   English   中英

Flutter 多個 Firestore 查詢

[英]Flutter Multiple Firestore Queries

我正在嘗試對 Firestore 進行多次查詢,並將結果合並到一個 stream 中,就像這里一樣。 我嘗試使用StreamGroup.merge()但它只返回一個 stream 的結果。我注意到它實際上確實獲取了所有流的數據,但只在一切完成時返回一個。 這是我所做的:

Stream getStream(){
    List<Stream> streams = [];     

    streams.add(Firestore.instance.collection(Constants.REQUESTS_NODE).
    where("municipality",isEqualTo: "City of Johannesburg Metropolitan").
    where("service_id",isEqualTo: 2).
    snapshots());
    streams.add(Firestore.instance.collection(Constants.REQUESTS_NODE).
    where("municipality",isEqualTo: "Lesedi Local").where("service_id",isEqualTo: 2).
    snapshots());    

    return StreamGroup.merge(streams);

  }

我錯過了什么和做錯了什么? 我這樣做的原因是為了彌補 Firestore 缺少OR運算符的不足。

我在網上找到了這個,希望它有幫助:

`import 'package:async/async.dart';

Stream<DocumentSnapshot> stream1 = firestore.document('/path1').snapshots();
Stream<DocumentSnapshot> stream2 = firestore.document('/path2').snapshots();
StreamZip bothStreams = StreamZip([stream1, stream2]);

// To use stream
bothStreams.listen((snaps) {
 DocumentSnapshot snapshot1 = snaps[0];
 DocumentSnapshot snapshot2 = snaps[1];

 // ...
});`

您可以使用whereIn條件,它是一個List<dynamic> ,這對我whereIn

例如:

Firestore db = Firestore.instance;
db.collection
.where("status", whereIn: ["available", "unavailable", "busy"])
.getDocuments();

對於將來可能需要幫助的人,我設法使用StreamZip解決它。 您可以從這個網站上閱讀更多相關信息

使用collectionGroup()

一個集合組由具有相同 ID 的所有 collections 組成。 默認情況下,查詢從數據庫中的單個集合中檢索結果。 使用集合組查詢從集合組而不是單個集合中檢索文檔。

文檔中的示例

例如,您可以通過向每個城市添加地標子集合來創建地標集合組:

final citiesRef = FirebaseFirestore.instance.collection("cities");

final ggbData = {"name": "Golden Gate Bridge", "type": "bridge"};
citiesRef.doc("SF").collection("landmarks").add(ggbData);

final lohData = {"name": "Legion of Honor", "type": "museum"};
citiesRef.doc("SF").collection("landmarks").add(lohData);

final gpData = {"name": "Griffth Park", "type": "park"};
citiesRef.doc("LA").collection("landmarks").add(gpData);

final tgData = {"name": "The Getty", "type": "museum"};
citiesRef.doc("LA").collection("landmarks").add(tgData);

final lmData = {"name": "Lincoln Memorial", "type": "memorial"};
citiesRef.doc("DC").collection("landmarks").add(lmData);

final nasaData = {
  "name": "National Air and Space Museum",
  "type": "museum"
};
citiesRef.doc("DC").collection("landmarks").add(nasaData);

final upData = {"name": "Ueno Park", "type": "park"};
citiesRef.doc("TOK").collection("landmarks").add(upData);

final nmData = {
  "name": "National Musuem of Nature and Science",
  "type": "museum"
};
citiesRef.doc("TOK").collection("landmarks").add(nmData);

final jpData = {"name": "Jingshan Park", "type": "park"};
citiesRef.doc("BJ").collection("landmarks").add(jpData);

final baoData = {"name": "Beijing Ancient Observatory", "type": "musuem"};
citiesRef.doc("BJ").collection("landmarks").add(baoData);

我們可以使用前面描述的簡單和復合查詢來查詢單個城市的地標子集合,但您可能還想一次從每個城市的地標子集合中檢索結果。

landmarks 集合組由所有 collections 和 ID landmarks 組成,您可以使用集合組查詢來查詢它。 例如,此收藏組查詢檢索所有城市的所有博物館地標:

FirebaseFirestore.instance
    .collectionGroup("landmarks")
    .where("type", isEqualTo: "museum")
    .get()
    .then(
      (res) => print("Successfully completed"),
      onError: (e) => print("Error completing: $e"),
    );

暫無
暫無

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

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