J'interroge des documents par horodatage et il renvoie un tableau vide. Cependant, cela fonctionne lorsque j'utilise "==" ex: .where ('date', '==', timestamp) , et renvoie un tableau vide lorsque j'utilise '> =' ou '<=' .
J'ai essayé de convertir l'horodatage en objet de date et en chaîne également, mais sans succès.
Remarque : le champ de date dans Firestore est de type Horodatage .
J'interroge des documents dont la date est supérieure à "2018-08-03" dans la collection.
Ci-dessous, une image de la collection de transactions (à gauche) et du document (à droite) qui devraient faire partie du tableau de documents renvoyés, car la date est supérieure à '2018-08-03'
Ci-dessous mon code.
Logs after trying ">" (equal to timestamp1) Firestore (2.3.0) 2019-10-03T14:01:25.013Z AObRG [ClientPool.acquire]: Re-using existing client with 100 remaining operations Firestore (2.3.0) 2019-10-03T14:01:25.015Z AObRG [Firestore.readStream]: Sending request: {"parent":"projects/valuemo-000/databases/(default)/documents/Users/Xmr3vKT19OSST02DSTDMt0jSq692","structuredQuery":{"from":[{"collectionId":"transactions"}],"where":{"compositeFilter":{"op":"AND","filters":[{"fieldFilter":{"field":{"fieldPath":"item_id"},"op":"EQUAL","value":{"stringValue":"zGRkpP3QkzI89zKyDjZ7FPDrXd5G3Bco5ENlR"}}},{"fieldFilter":{"field":{"fieldPath":"date"},"op":"EQUAL","value":{"timestampValue":{"seconds":1533254400}}}}]}}}} Firestore (2.3.0) 2019-10-03T14:01:25.232Z AObRG [Firestore._initializeStream]: Received stream error: { Error: The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB at Http2CallStream.call.on (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call.js:68:41) at Http2CallStream.emit (events.js:194:15) at process.nextTick (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call-stream.js:71:22) at process.internalTickCallback (internal/process/next_tick.js:70:11) code: 9, details: 'The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB', metadata: Metadata { options: undefined, internalRepr: Map {} } } Firestore (2.3.0) 2019-10-03T14:01:25.256Z AObRG [Firestore._initializeStream]: Received initial error: { Error: The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB at Http2CallStream.call.on (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call.js:68:41) at Http2CallStream.emit (events.js:194:15) at process.nextTick (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call-stream.js:71:22) at process.internalTickCallback (internal/process/next_tick.js:70:11) code: 9, details: 'The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB', metadata: Metadata { options: undefined, internalRepr: Map {} } } Firestore (2.3.0) 2019-10-03T14:01:25.260Z AObRG [Firestore._retry]: Request failed with unrecoverable error: { Error: The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB at Http2CallStream.call.on (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call.js:68:41) at Http2CallStream.emit (events.js:194:15) at process.nextTick (D:\Projects\Valuemo-firebase\node_modules\@grpc\grpc-js\build\src\call-stream.js:71:22) at process.internalTickCallback (internal/process/next_tick.js:70:11) code: 9, details: 'The query requires a COLLECTION_ASC index for collection transactions and field date. That index is not ready yet. See its status here: https://console.firebase.google.com/project/valuemo-000/database/firestore/indexes/single_field?create_exemption=ClJwcm9qZWN0cy92YWx1ZW1vLTAwMC9kYXRhYmFzZXMvKGRlZmF1bHQpL2NvbGxlY3Rpb25Hcm91cHMvdHJhbnNhY3Rpb25zL2ZpZWxkcy9kYXRlEAEaCAoEZGF0ZRAB', metadata: Metadata { options: undefined, internalRepr: Map {} } }
Résultat attendu : doit être un tableau avec des transactions dont la date est supérieure à celle spécifiée ci-dessus.
Résultat réel : tableau vide.
Depuis qu'il travaille pour l'égalité == , j'ai supposé que > = et <= fonctionneraient. Quelque chose me manque ici?
const firstDay = new Date('2018-08-03'); const timestamp1 = admin.firestore.Timestamp.fromDate(firstDay); const trans = []; const docRef = db.collection('Users').doc(uid).collection('transactions').where('item_id', '==', item_id) .where('date', '>=', timestamp1); await docRef.get() .then((snapshot) => { snapshot.forEach((doc) => { trans.push({ transaction_id: doc.id, transaction: doc.data() }); }); }) .catch(err => new Error('cannot get the documents', err));
3 Réponses :
Prenez votre date et convertissez-la en objet de date javascript. Ensuite, faites getTime () sur l'objet de date converti, il retournera un nombre. Ensuite, récupérez l'horodatage firestore et faites getSeconds (). Comparez la valeur des secondes de l'horodatage firestore avec la variable stockant la sortie de getTime ().
Ouais, mais comment suis-je censé l'utiliser sur la clause where?
obtenir toutes les données et les stocker dans une structure de données comme un tableau ou un objet. Ensuite, parcourez-le et comparez chacun d'eux et stockez les données valides dans un autre tableau, puis utilisez-le. Il n'existe aucun moyen de comparer directement deux types de date différents à l'aide de la clause where. Vous n'avez pas non plus à utiliser après avoir utilisé async await. Il suffit d'écrire le code directement après attendre
Je l'ai donc testé, avec ce que je pense être une configuration très similaire à ce que vous avez présenté, et j'ai en fait pu reproduire le même comportement.
Après avoir testé différentes possibilités, j'ai trouvé que le problème pour moi n'avait rien à voir avec le type de données des champs, mais avec la configuration de l'index composite .
La configuration d'index composite requise pour que cette requête fonctionne était la suivante:
Selon la section Requêtes supportées par les index composites de la documentation, les index de ce type de requêtes composées doivent avoir le champ filtré d'égalité en premier, ce n'est pas dit explicitement, mais c'est ainsi que la documentation le présente dans les exemples.
Faites-moi savoir si cela a permis de résoudre le problème pour vous.
La requête nécessite un index COLLECTION_ASC pour les transactions de collecte et la date du champ. Cet index n'est pas encore prêt.
Pourquoi ne pas créer l'index comme le suggère l'erreur? Cela pourrait fondamentalement résoudre votre problème.
Veuillez modifier la question pour afficher exactement les documents de la collection que vous prévoyez d'être renvoyés par cette requête, ainsi que les valeurs réelles de
firstDay
et de toutes les autres variables. Sans voir les données réelles, nous ne savons pas si vous demandez des documents correspondant à la requête. Votre question doit montrer que la requête ne correspond certainement pas à vos attentes, à la vue de tous.@DougStevenson J'ai ajouté une image de la structure de la base de données et un document avec son champ.
Je pense que vous comparez peut-être de mauvais types. vous comparez la date avec un horodatage. Une valeur d'horodatage est comparée à un type de date. Voici quelques informations supplémentaires: stackoverflow.com/questions/19141030/...
Les dates @Aye_baybae sont comparables aux horodatages. Ce n'est pas un problème. Le problème qui n'est toujours pas clair est le fuseau horaire de la date. Quel fuseau horaire est requis pour le
2018-08-03
? Tout le monde n'est pas le même jour dans le monde.@DougStevenson J'ignore le fuseau horaire, la chose dont je ne comprends pas pourquoi utiliser '==' renvoie le document avec cet horodatage spécifique mais utiliser '> =' ou '<=' ne fonctionne pas.
Je viens de le tester avec un nouveau projet et le comportement des opérateurs '==' et '> =' a fonctionné comme prévu pour un champ d'horodatage. Je pense que @DougStevenson a raison dans ce cas. Cela aiderait beaucoup si vous pouviez partager un journal des valeurs de la requête qui fonctionne et nous montrer comment vous
firstDay
la valeur de la variablefirstDay
.@pessolato ajoute les logs et la ligne de variable firstDay dans la section code.
Je m'excuse, ce que je voulais dire dans mon commentaire précédent était de consigner les résultats de la requête avec l'opérateur
==
, les journaux de l'objet de requête réel ne fournissent aucune information utile.@pessolato J'ai ajouté le résultat de la requête comme demandé.