92 votes

Requête Firestore par plage de dates

J'ai besoin d'aide pour interroger une collection longue avec une plage de dates. Voir le document d'exemple ci-dessous. Je veux interroger le champ startTime en utilisant une plage de dates.

enter image description here

enter image description here

0 votes

Toutes ces réponses présentent un énorme défaut : une requête ne peut contenir que des ">" ou des "<" dans un seul champ. Cela signifie qu'en utilisant cette approche pour le filtrage des dates, il sera impossible de filtrer sur les plages d'autres champs.

148voto

Capy Points 1540

Puisque j'ai le dueDate champ stocké en tant que "timestamp" (et NON en tant que chaîne de caractères o numéro ) sur Cloud Firestore, j'ai fait cela pour obtenir les documents de facturation avec une date d'échéance en 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 a été stocké chez firebase avec un objet Date(). par exemple : this.doc.dueDate = new Date('2017-12-25')

1 votes

Si vous faites une capture d'écran de votre firestore, est-il possible à partir de là de faire visuellement la différence entre un objet datetime ou une chaîne de caractères ?

0 votes

Oui @DauleDK regarde : imgur.com/a/draQo le troisième champ a été rempli avec un objet js Date() et il a été stocké comme un timestamp (firebase a fait la conversion). Et sur l'image vous verrez ce timestamp formaté en UTC MAIS je l'ai enregistré comme un objet Date. Et enfin, pour vérifier s'il s'agit vraiment d'un champ d'horodatage, il suffit de le survoler. Dans mon cas, je vois "Marca de tiempo" qui signifie "timestamp".

3 votes

Wow c'est génial - quelque chose qui devrait certainement être ajouté à la documentation sur les requêtes firestore. J'ai le sentiment que nous verrons de nombreuses mises à jour de la console firebase-firestore. "Marce de tiempo" - la leçon la plus précieuse apprise aujourd'hui, gracias ;)

30voto

DauleDK Points 1308

Vous pourriez stocker l'objet datetime comme Temps Unix (secondes depuis le 1er janvier 1970). Ensuite, vous pouvez simplement utiliser la sélection where comme ceci :

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

Btw - pour convertir une date en heure Unix dans votre application, vous pouvez utiliser l'excellente bibliothèque (maintenant dépréciée) moment (si vous construisez quelque chose avec js ou node).

1 votes

Merci, mais j'ai déjà des données avec un format de date comme la capture d'écran ci-jointe.

0 votes

Ok. Selon firebase, datetime est un type de données supporté par firestore. Est-ce que le startTime est une chaîne ou un objet datetime ?

0 votes

C'est un objet dateTime ce n'est pas une chaîne de caractères

7voto

ThdK Points 1495

Pour tous ceux qui utilisent depuis peu Firebase Firestore, il y a une différence selon les paramètres de votre implémentation Firebase (selon la version de Firebase).

Avant, Firestore économisait Timestamp en tant que Date mais tel que décrit ici dans les docs qui sera bientôt remplacé par un Timestamp objet. Voir le Documentation sur l'horodatage ici .

Vous pouvez déjà forcer votre implémentation en ajoutant un paramètre dans votre code pour forcer Firebase à utiliser des objets Timestamp au lieu de Date comme cet exemple :

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

1 votes

Il s'agit d'une fonction dépréciée qui sera supprimée dans une prochaine version. Firebase veut que vous spécifiez les objets Timestamp spécifiquement, à l'avenir.

3voto

La solution est d'utiliser Date.now(). Arrêtez d'utiliser le service timestamp de Firebase, vous devez travailler avec la valeur numérique du temps en millisecondes comme par exemple : 1514271367000, au lieu de cela si Firestore utilise 26/12/2017 1:56:07 GMT- 0500 (-05) ne fonctionnera pas. Voici un exemple de requête :

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

2 votes

Est-il possible que Firestore enregistre Date.now() en tant que données numériques ? J'ai l'impression qu'il est préférable d'avoir une date dans certains cas, juste pour cette raison et pour la facilité de compréhension.

0 votes

Il semble s'agir du code de la base de données en temps réel de Firebase (il utilise par exemple startAt y endAt ) et non le code Firestore (qui utiliserait where voir aquí ). Les deux sont similaires, mais pas identiques.

0 votes

Quel est le fuseau horaire pensé. Lorsque je détermine le nombre, dois-je convertir la date en heure GMT ?

1voto

x7679999 Points 1

Dans une application frontale, c'est ainsi que les horodatages et les dates de Firebase peuvent être utilisés pour interroger et stocker des documents.

Firestore date usage

3 votes

Bonjour. Bien que les liens externes puissent être utiles, veuillez insérer le contenu de votre réponse directement dans SO.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X