如何使用 Flutter 在 Firestore 中检查多个文档中的特定值

Posted

技术标签:

【中文标题】如何使用 Flutter 在 Firestore 中检查多个文档中的特定值【英文标题】:How to check a specific Value in multiple Documents in Firestore with Flutter 【发布时间】:2020-11-21 23:41:30 【问题描述】:

我正在尝试检查我的集合中的任何文档是否包含具有特定时间的值。但我做错了什么。

我正在寻找一种方法来检查我的集合中的任何文档是否在“CreatedAt”字段中包含“DateTime.now().year”。

  List documents = [];

  @override
  void initState() 
    Firestore.instance.collection('Collection').getDocuments().then((snapshot) 
  List<DocumentSnapshot> allDocs = snapshot.documents;
  List<DocumentSnapshot> yearDocs = allDocs.where((e) => e.data['createdAt'].toDate.year() == DateTime.now().year).toList();
  // iterate over your yearDocs, and add the data to documents
  yearDocs.forEach((item)
    documents.add(item);
  );
);
    super.initState();
  

我想设置一个包含文档的列表,其中“字段”包含“DateTime.now().year”。然后我检查列表是否为空。

documents.length >= 1? Container(
    child:  Text('works'),
  ) : SizedBox(),

【问题讨论】:

你能帮我解决这个错误吗? 【参考方案1】:

答案 3.0

你的答案在于以下

DataSnapshot 数组中获取createdAt 元素,即allDocs 有一个catch是createdAt带入Firebase TimeStamp实例格式的时间戳,即=>TimeStamp(seconds=int, nanoseconds=int),例如:Timestamp(seconds=1593504718, nanoseconds=706167000) 我们关心的是获取seconds,它只是一个时间戳 使用秒并从中获取Year,并将其存储在您的yearDocs

要获取年份形式的数据,我们这样做

allDocs.forEach((item) => print(item.data["createdAt"].seconds));

// gives your timestamp
// 1593504718
// 1593504699
// 1593259892
// 1596121191

我们可以通过这样做得到年份

new DateTime.fromMillisecondsSinceEpoch(1593504718 * 1000).year

结合所有这些,让我们编码:

  List documents = [];

  @override
  void initState() 
    Firestore.instance.collection('Collection').getDocuments().then((snapshot) 
       List<DocumentSnapshot> allDocs = snapshot.documents;
  
       // now here we get the data in respect of year
       List<DocumentSnapshot> yearDocs = allDocs.where((e) => 
          DateTime.fromMillisecondsSinceEpoch(e.data["createdAt"].seconds * 1000).year == DateTime.now().year).toList();
  
       print(yearDocs.length);
  
       // iterate over your yearDocs, and add the data to documents
       yearDocs.forEach((item)
         documents.add(item);
       );

       print(documents.length);
    );
  

休息就好了,您可以按照documents.length 填充数据。请让我知道这是否对您有帮助。 :) 这也将帮助您获得一些见解 => DateTime class

【讨论】:

我改进了我的代码,就像在我的问题中一样,但即使“createdAt”的年份与当前年份匹配,列表也是空的。 查看我的改进部分@Kinnay,如果有帮助请告诉我 那么问题来了,你的数据无法正确获取。让我们逐行调试,然后找出解决方案。你准备好了@Kinnay 吗?此外,我将让我的答案仅反映必须为您工作的解决方案。您可以保留您的代码,但根据我在您的代码中提供的代码进行修改。 年份文档为空。我得到这些错误: I/flutter (18109): 0 E/flutter (18109): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:NoSuchMethodError:闭包调用参数不匹配:函数“年”E/flutter(18109):接收者:关闭:()=>来自函数“toDate”的日期时间:。 E/flutter (18109):尝试调用:year() E/flutter (18109):找到:year() => DateTime【参考方案2】:

我认为你错过了data

yearDocs = allDocs.where((e) => e.data['createdAt'].toDate.year() == DateTime.now()).toList();

【讨论】:

我猜,你是对的 lenz。但我们仍然不确定,他现在面临什么样的错误

以上是关于如何使用 Flutter 在 Firestore 中检查多个文档中的特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Flutter 在 Firestore 中删除集合中的所有文档

如何在 Flutter Web 上使用 StreamBuilder 和 Firestore?

如何在 Firebase + Firestore + Flutter 中使用 StreamBuilder 将所有子集合数据获取到 Widget

如何在flutter的firestore中使用uid更新用户数据

如何在flutter中获取firestore文档的documentid?

如何使用flutter cloud_firestore包传递firestore auth token