【问题标题】:Exclude documents from firebase query using date使用日期从 firebase 查询中排除文档
【发布时间】:2020-12-05 01:14:42
【问题描述】:

我有一个帖子模型,它有一个发布时间和过期时间,就像这样

class BuyerPost{
  ..some other properties...
  final Timestamp postTime;
  final Timestamp expireTime;

我的预期结果是过期的帖子不会包含在我的查询中。如果我可以自动从数据库中删除它们就更好了,但我也可以将它们从我的查询中排除。

我曾尝试使用endAtorderBy 来实现它,但它失败了

  Stream <List<BuyerPost>> get sellerBuyerPosts {
    try {
      return buyerPostCollection.where('status',isEqualTo: 'available')
          .orderBy('expireTime',descending: true)
          .endAt([Timestamp.now()])
          .snapshots()
          .map(yieldSellerBuyerPosts);
    }catch(e){
      print(e.toString());
      return null;
    }
  }

我也尝试在客户端进行过滤,但出现类型运算符错误,因为 &lt;,&gt; 不适用于时间戳

  List<BuyerPost> yieldSellerBuyerPosts(QuerySnapshot snapshot) {
    try {
      return snapshot.documents.map((doc) {
        return BuyerPost(
          ...some properties here...
          postTime: doc.data['postTime']?? Timestamp(0,0),
          expireTime: doc.data['expireTime']?? Timestamp(0,0),

        );
      }).where((post) =>
          post.expireTime>Timestamp.now()
      ).toList();
    }catch(e){
      print(e.toString());
      return null;
    }
  }

是我使用了错误的方法还是我只是在某个地方犯了一个小错误。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    不要在此查询中使用endAt。那是用于分页的,您在这里没有使用它。如果要限制字段的值范围,请使用另一个“where”过滤器来指定该字段的值范围:

    return buyerPostCollection
        .where('status', isEqualTo: 'available')
        .where('expireTime', isLessThan: Timestamp.now())
        .orderBy('expireTime', descending: true)
        .snapshots()
    
    

    【讨论】:

      【解决方案2】:

      第一种方法实际上有效,唯一的问题是它不能与流一起工作。您将在帖子查询中看到更新的唯一方法是更改​​小部件状态,您会发现过期的帖子消失了。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        • 2021-09-16
        • 1970-01-01
        相关资源
        最近更新 更多