日期时间在 Firebase Firestore 中保存为字符串

问题描述 投票:0回答:1

我在 Firebase Firestore 中有相当多的数据,其 createDate 字段保存为 ISO 8601 字符串 (2024-05-15T18:08:30.825890)。之前我不需要执行任何日期比较,但现在这是我的应用程序的要求。问题是,当我在字段上执行日期比较时,例如

var usersSnapshot = await FirebaseFirestore.instance.collection("users").where('dateCreated', isGreaterThan: dateCreated).get()
我得到 0 个结果。我怀疑这是因为我的 firestore 中的字段是用字符串类型保存的,而不是时间戳类型。

我应该迁移所有数据并将字段类型从字符串更改为时间戳(这是一种非常侵入性的解决方案),还是我可以做其他事情才能使用现有数据运行上面的查询?

flutter google-cloud-firestore
1个回答
0
投票

这个问题的解决方案很少。 第一个也是好的解决方案是将字符串迁移到时间戳

  1. 迁移数据 到时间戳(长期可扩展性的首选) 这涉及将所有 createdDate 字段从字符串转换为 Firestore Timestamp 对象。虽然您需要读取该特定集合中的所有文档,以便它们更改所有实例。您还必须确保在添加新数据时它需要是时间戳格式而不是字符串。

以下是迁移数据的方法:

import 'package:cloud_firestore/cloud_firestore.dart';

Future<void> migrateDateCreatedField() async {
  CollectionReference usersRef = FirebaseFirestore.instance.collection('users');
  QuerySnapshot snapshot = await usersRef.get();

  for (QueryDocumentSnapshot doc in snapshot.docs) {
    String? dateCreatedString = doc['dateCreated'];
    if (dateCreatedString != null) {
      DateTime dateCreated = DateTime.parse(dateCreatedString);
      //or use doc refrence to update the document
      await usersRef.doc(doc.id).update({'dateCreated': Timestamp.fromDate(dateCreated)});
    }
  }
}
  1. 第二种方法将从 Firestore 集合中获取所有文档并在客户端过滤它们,这似乎是绕过查询限制的简单解决方案。但是,这种方法有明显的缺点: 性能问题:加载整个数据集可能会减慢您的应用程序的速度并消耗更多的设备资源,尤其是对于大型集合。 更高的成本:Firestore 对每个读取的文档收费,因此获取不必要的数据会增加成本。 可扩展性问题:随着数据库的增长,这种方法变得越来越低效和不切实际。 由于性能不佳和成本影响,生产应用程序最好避免使用这种方法
© www.soinside.com 2019 - 2024. All rights reserved.