Firestore query by date range

前端 未结 9 834
悲&欢浪女
悲&欢浪女 2020-12-02 12:11

I need the help to query long collection with date range. See the below example document. I wanna query startTime field using date range.

相关标签:
9条回答
  • 2020-12-02 12:20

    Since I have the dueDate field stored as "timestamp" (and NOT as string or number) on Cloud Firestore, I did this to get the invoice documents with a due date on 2017:

    let start = new Date('2017-01-01');
    let end = new Date('2018-01-01');
    
    this.afs.collection('invoices', ref => ref
      .where('dueDate', '>', start)
      .where('dueDate', '<', end)
    );
    

    NOTE: dueDate field was stored at firebase with a Date() object. e.g.: this.doc.dueDate = new Date('2017-12-25')

    0 讨论(0)
  • 2020-12-02 12:27

    Those who, like me, are using PHP to access Firestore, can do something like this:

    $startTime = new DateTime('2020-05-23 00:00:00');
    $endTime = new DateTime('2020-06-23 23:59:59');
    
    $start = new Google\Cloud\Core\Timestamp($startTime);
    $end = new Google\Cloud\Core\Timestamp($endTime);
    
    // fb is a Google\Cloud\Firestore\FirestoreClient object
    $this->query = $this->fb->collection('your_collection');
    
    $aux = $this->query;
    $aux = $aux->where('startTime', '<', $end);
    $aux = $aux->where('startTime', '>', $start);
    
    return $aux->documents();
    

    Enjoy.

    0 讨论(0)
  • 2020-12-02 12:30

    In a frontend application, this is how Firebase timestamps and dates can be used to query and store documents.

    Firestore date usage

    0 讨论(0)
  • 2020-12-02 12:33
        var startfulldate = admin.firestore.Timestamp.fromDate(new Date(1556062581000));
        db.collection('mycollection')
          .where('start_time', '<=', startfulldate)
          .get()
          .then(snapshot => {              
                var jsonvalue: any[] = [];
                snapshot.forEach(docs => {
                  jsonvalue.push(docs.data())
                   })
                     res.send(jsonvalue);
                     return;
                    }).catch( error => {
                        res.status(500).send(error)
                    });
    
    0 讨论(0)
  • 2020-12-02 12:35

    Generic function to find documents in a collection by date range of specifics fields:

    public List<QueryDocumentSnapshot> findDocsByDateRange(String collection, 
                                                           String fieldStartDate,
                                                           String fieldEndDate,
                                                           Date startDate, 
                                                           Date endDate) {
        ApiFuture<QuerySnapshot> querySnapshot = fireStore()
                        .collection(collection)
                        .whereGreaterThanOrEqualTo(FieldPath.of(fieldStartDate), startDate)
                        .whereLessThanOrEqualTo(FieldPath.of(fieldEndDate), endDate)
                        .get();
        return querySnapshot.get().getDocuments();
    }
    

    Packages:

    import com.google.api.core.ApiFuture;
    import com.google.cloud.firestore.DocumentSnapshot;
    import com.google.cloud.firestore.FieldPath;
    import com.google.cloud.firestore.Firestore;
    import com.google.cloud.firestore.QueryDocumentSnapshot;
    import com.google.cloud.firestore.QuerySnapshot;
    
    0 讨论(0)
  • 2020-12-02 12:40

    You could store the datetime object as Unix time (seconds since 1 January 1970). Then you can simple use the where select like this:

    collectionRef.where("startTime", ">=", "1506816000").where("startTime", "<=", "1507593600")

    Btw - to convert from datetime to Unix time in your app, you can use the excellent library moment (if you are building something with js or node).

    0 讨论(0)
提交回复
热议问题