首页 > 解决方案 > flutter firestore 包含任何不获取文档的查询

问题描述

我有一些文档存储在 firebase 的播放器下,它们都有一个带有 num 值(例如 1、3 或 25)的 id 字段。现在我只有 30 名玩家,但是当我只需要一些来避免不必要的阅读时,我会尽量避免获得所有 30 名玩家。我有一个包含我想要的所有玩家 ID 的列表,我正在尝试使用 arrayContainsAny 来解决我的问题,例如:

FirebaseFirestore.instance.collection('players').where("id", arrayContainsAny: widget.selectedPlayer);

正如我所说,小部件选择的播放器是列表,我也尝试使用 [1, 2] 代替 widget.selectedPlayer 但它们都没有返回任何文档。

PS:我尝试使用等于,它工作正常:

FirebaseFirestore.instance.collection('players').where("id", isEqualTo:  27)

这是我的代码部分

players = FirebaseFirestore.instance.collection('players').where("id", arrayContainsAny: widget.selectedPlayer);


return StreamBuilder<QuerySnapshot>(
  stream: players.snapshots(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasError) {
      return Text('Something went wrong');
    }

    if (snapshot.connectionState == ConnectionState.waiting) {
      return Text("Loading");
    }
    var sortedPlayers = sortPlayersByPosition(snapshot.data.docs);
    debugPrint("player docs: " + sortedPlayers.toString());
    return ListView.builder(
      padding: EdgeInsets.all(0.0),
      itemCount: snapshot.data.docs.length + 1,
      itemBuilder: (BuildContext context, int index) {
        if (index == 0) {
          // return the header
          return playerHeaderRow(header);
        }
        index -= 1;
        if (widget.selectedPlayer.contains(sortedPlayers[index]["id"])) {
          return buildPlayers(sortedPlayers[index]);
        } else {
          // need to return a empty widget here but return null stop the loop when we come to a false case
          // this will create a empty widget : https://stackoverflow.com/a/55796929
          return SizedBox.shrink();
        }
      },
    );
  },
);

标签: fluttergoogle-cloud-firestore

解决方案


好的,如果你想使用这个函数“查询返回给定字段与任何比较值匹配的文档。”

你应该使用 where 而不是 arraycontainsany,我希望他们在某个地方有一个文档


推荐阅读