Firestore-zoekopdracht op datumbereik

Ik heb hulp nodig bij het opvragen van een lange verzameling met datumbereik. Zie onderstaand voorbeelddocument. Ik wil het startTime-veld opvragen met een datumbereik.

voer hier de afbeeldingsbeschrijving in

voer hier de afbeeldingsbeschrijving in


Antwoord 1, autoriteit 100%

Aangezien ik het veld dueDateheb opgeslagen als “timestamp” (en NIET als stringof getal) in Cloud Firestore, heb ik dit gedaan om de factuurdocumenten met een vervaldatum op 2017 te krijgen:

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)
);

OPMERKING:dueDateveld is opgeslagen op firebase met een Date() object. bijv.: this.doc.dueDate = new Date('2017-12-25')


Antwoord 2, autoriteit 20%

Je zou het datetime-object kunnen opslaan als Unix-tijd(seconden sinds 1 januari 1970). Dan kunt u eenvoudig de waar selecteren als volgt gebruiken:

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

Btw – om van datetime naar Unix-tijd in uw app te converteren, kunt u de uitstekende (nu verouderde) bibliotheek moment(als je iets bouwt met js of node).


Antwoord 3, autoriteit 16%

   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)
                });

Antwoord 4, autoriteit 12%

const event = new Date();
const expirationDate = admin.firestore.Timestamp.fromDate(event);
const query = collectionRef.where('startTime', '<=', expirationDate)

Antwoord 5, autoriteit 5%

Voor iedereen die onlangs Firebase Firestore heeft gebruikt, is er een verschil, afhankelijk van uw instellingen van uw Firebase-implementatie (afhankelijk van de firebase-versie).

Vroeger sloeg Firestore Timestampop als een Date, maar zoals beschreven hier in de documentenwordt het binnenkort vervangen door een Timestamp-object. Bekijk de Timestamp-documenten hier.

U kunt uw implementatie al forceren door een instelling in uw code toe te voegen om Firebase te dwingen Timestamp-objecten te gebruiken in plaats van Datezoals in dit voorbeeld:

var firebaseApp = firebase.initializeApp({
    apiKey: [APIKEY],
    authDomain: [FIREBASEAPPDOMAIN],
    projectId: [PROJECTID]
});
var firestore = firebase.firestore();
var settings = { timestampsInSnapshots: true }; // force Timestamp instead of Date
firestore.settings(settings);

Antwoord 6, autoriteit 4%

Omdat startTimeis opgeslagen als Timestamp, kunt u dit zoekbereik nauwkeuriger maken (dit is goed voor zowel een lange periode als een zelfde periode).

p>

const start = new Date('2021-01-01T00:00:00.000z');
const end = new Date('2021-03-01T23:59:59.000z');
db.collection('Data').where('startTime', '>=', start).where('startTime', '<=', end).get().then(data => {
   //pass your 'data' here
});

Ik heb dit gebruikt in mijn Node.js-apps. Hopelijk is dit nuttig.


Antwoord 7, autoriteit 2%

De oplossing is om Date.now() te gebruiken. Stop met het gebruik van de tijdstempelservice van Firebase, u moet werken met de numerieke waarde van de tijd in milliseconden, zoals bijvoorbeeld: 1514271367000, in plaats daarvan werkt Firestore 26/12/2017 1:56:07 GMT- 0500 (-05) niet . Een voorbeeld van een zoekopdracht is:

this.fsService.afs.collection('chats/4bY1ZpOr1TPq8bFQ3bjS/finance/123+finance/12345'
          , ref => ref.orderBy('hour').startAt(1514184967000).endAt(1514271367000))
          .valueChanges().subscribe(data =>{
            this.mensajes = data;
          })

Antwoord 8

Degenen die, net als ik, PHP gebruiken om toegang te krijgen tot Firestore, kunnen zoiets als dit doen:

$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();

Veel plezier.


Antwoord 9

Ik denk dat dit je zal helpen,

yourMethod() {
    var date = DateTime.now();//
    print("First Date > " + DateTime(date.year, date.month, 1).toString());
    var datex = new DateTime(date.year, date.month + 1, 0);
    print("Last Date > " +datex);//
    //
    Firestore.instance
        .collection('biling')
        .where("driverId", isEqualTo: widget.uid)
        .where("date",
            isGreaterThanOrEqualTo:
                new DateTime(date.year, date.month, 1).toString())//1
        .where("date", isLessThanOrEqualTo: datex.toString())//2
        .orderBy('date', descending: true)
        .getDocuments()
        .then(
          (QuerySnapshot snapshot) => {
            snapshot.documents.forEach((f) {
              if (this.mounted) {
                setState(() {
                  totalP += double.tryParse(f.data["price"]);
                });
              }
              print("_price " + f.data["price"]);
              print("_duePaymntForCompay " + f.data["duePaymntForCompay"]);
            }),
          },
        );
  }

Antwoord 10

Algemene functie om documenten in een collectie te vinden op datumbereik van specifieke velden:

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();
}

Pakketten:

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;

Antwoord 11

In een frontend-applicatie kunnen Firebase-tijdstempels en -datums op deze manier worden gebruikt om documenten op te vragen en op te slaan.

Firestore-datumgebruik


Antwoord 12

Wat voor mij werkte, was
Formatteer datum met Moment JS en splits op in Dag, Maand & Jaar

const currentDate = moment().format("DD-MM-YYYY").split("-");
const currentDay = currentDate[0];
const currentMonth = currentDate[1];
const currentYear = currentDate[2];
const allDocuments = await collectionRef
.doc(docId)
.collection(*COLLECTION NAME*)
.where(
  *DATE PARAMETER NAME*,
  ">=",
  new Date(`${currentYear}-${currentMonth}-${currentDay}`)
)
.where(
  *DATE PARAMETER NAME*,
  "<",
// ${parseInt(currentDay) + *Number of days you want in range*} 
  new Date(`${currentYear}-${currentMonth}-${parseInt(currentDay) + 1}`)
)
.get();

Other episodes