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.
Antwoord 1, autoriteit 100%
Aangezien ik het veld dueDate
heb 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:dueDate
veld 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 Timestamp
op 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 startTime
is 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.
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();