Veuillez lire la documentation de la version stable si vous souhaitez uniquement utiliser Fuego
Un client Firestore en ligne de commande.
Téléchargez l'un des binaires précompilés de la dernière version. (builds disponibles pour Windows, Linux, Macintosh / Darwin)
Les utilisateurs de Linux peuvent installer Fuego via Snap. Cependant, vous devrez probablement l'installer en utilisant --Devmode pour qu'il puisse accéder à votre fichier Google_Application_Credentials.
snap install fuego --devmode
Si vous êtes à l'aise de construire des programmes, vous pouvez construire Fuego vous-même en utilisant Go:
git clone https://github.com/sgarciac/fuego.git
cd fuego
go build . # and 'go install .' if you want
./fuego --help
Vous aurez besoin d'un fichier clé de compte de service pour pouvoir accéder à la base de données Firestore de votre projet. Pour créer un fichier de clé privé de service, si vous n'en avez pas, accédez à votre console de projet Firebase, puis paramètres du projet , puis cliquez sur l'onglet des comptes de service et générez une nouvelle clé privée.
Une fois que vous aurez le fichier clé de votre compte de service, Fuego pourra le trouver en utilisant l'une des options suivantes:
--credentials
chaque fois que vous exécutez Fuego, c'est-à-dire: fuego --credentials ./my-account-service-private-key.json get mycollection mydocumentid
ou
export GOOGLE_APPLICATION_CREDENTIALS=./my-account-service-private-key.json
fuego get mycollection mydocumentid
Les bases de données Firestore appartiennent à des projets. Le fichier Google Application Indementiels définit généralement le projet sur lequel Firestore fonctionnera. Vous pouvez cependant, si nécessaire, définir le projet à l'aide de l'option globale --projectid
.
Si vous avez besoin d'utiliser Fuego avec l'émulateur Firestore au lieu d'une vraie base de données Firestore, définissez la variable d'environnement Firestore_EMulator_host sur quelque chose d'approprié (généralement, localhost: 8080). Remarque : Lorsque vous utilisez l'émulateur, vous n'utilisez probablement pas de fichier Google_Application_Credentials. Par conséquent, aucun projet ne sera défini. Vous pouvez définir un projet à l'aide de l'option globale --projectid
, sinon il utilisera «par défaut» comme identifiant de projet.
fuego collections
Retournera la liste des collections du projet.
Vous pouvez ajouter de nouveaux documents, en utilisant JSON:
fuego add people ' {"name": "sergio", "age": 41} '
# Rv7ZfnLQWprdXuulqMdf <- fuego prints the ID of the newly created document
De les récupérer, en utilisant l'ID:
fuego get people Rv7ZfnLQWprdXuulqMdf
# {
# "CreateTime": "2021-08-22T23:53:31.439821Z",
# "Data": {
# "age": 41,
# "name": "sergio"
# },
# "ID": "Rv7ZfnLQWprdXuulqMdf",
# "ReadTime": "2021-08-23T01:57:12.30626Z",
# "UpdateTime": "2021-08-22T23:53:31.439821Z"
# }
Ou les récupérer en utilisant plusieurs ID:
fuego getall people WkVlcPgEJIXzdyQS6H5d f2TbJA5DIhBfXwKrMbHP
[
# {
# "CreateTime": "2021-08-22T23:53:31.439821Z",
# "Data": {
# "age": 41,
# "name": "sergio"
# },
# "ID": "WkVlcPgEJIXzdyQS6H5d",
# "ReadTime": "2021-08-23T01:57:12.30626Z",
# "UpdateTime": "2021-08-22T23:53:31.439821Z"
# },
# {
# "CreateTime": "2021-08-22T23:53:31.439821Z",
# "Data": {
# "age": 23,
# "name": "rohan"
# },
# "ID": "f2TbJA5DIhBfXwKrMbHP",
# "ReadTime": "2021-08-23T01:57:12.30626Z",
# "UpdateTime": "2021-08-22T23:53:31.439821Z"
# }
# ]
Vous pouvez également remplacer un document existant:
fuego set people/Rv7ZfnLQWprdXuulqMdf '{"name": "sergio", "age": 42}' # It's my birthday!
Remarque : nous pouvons soit utiliser les arguments collection-path document-id json-data
, soit document-path json-data
. C'est également le cas pour la suppression et les commandes GET.
Dans les commandes add
et set
, l'argument du document peut être soit une chaîne JSON (si elle commence par le caractère {
) ou un chemin vers un fichier JSON, c'est-à-dire:
fuego add animals ./dog.json
Pour supprimer un document:
fuego delete people/Rv7ZfnLQWprdXuulqMdf
Remarque: Cela ne supprime aucune sous-collection sous le document.
Pour supprimer un document comprenant des sous-collections, utilisez le inducteur --recursive, -r
. L'utilisation de l'indicateur -r
supprimera également les documents manquants. Un document manquant est un document qui n'existe pas mais qui a des sous-documents.
fuego delete -r people/Rv7ZfnLQWprdXuulqMdf
Il est également possible de supprimer plusieurs documents sans transaction
fuego delete people Rv7ZfnLQWprdXuulqMdf,Rv7ZfnLQWprdXuulqMde
Suppression d'un champ spécifique d'un document, le drapeau --field, -f
peut être utilisé.
fuego delete people/Rv7ZfnLQWprdXuulqMdf -f age
Cette commande supprimera le champ d'âge de la voie de la durée donnée.
Pour mettre à jour un document existant:
fuego set --merge people Rv7ZfnLQWprdXuulqMdf ' {"location": "unknown"} '
# Rv7ZfnLQWprdXuulqMdf <- fuego prints the ID of the updated document
fuego get people Rv7ZfnLQWprdXuulqMdf
# {
# "CreateTime": "2021-08-22T23:53:31.439821Z",
# "Data": {
# "age": 41,
# "name": "sergio",
# "location": "unknown"
# },
# "ID": "Rv7ZfnLQWprdXuulqMdf",
# "ReadTime": "2021-08-23T01:57:12.30626Z",
# "UpdateTime": "2021-08-22T23:53:31.439821Z"
# }
Nos exemples ici utilisent uniquement JSON de base pour représenter les documents Firestore. Cependant, les types JSON ne sont pas suffisants pour représenter certains types de Firestore, par exemple les géo-locations ou les horodatages.
Veuillez lire la documentation des types si vous souhaitez savoir comment Fuego mappe les documents JSON sur les documents Firestore et comment exprimer le système de type plus avancé à l'aide de notre «JSON étendu».
Vous pouvez travailler sur des sous-collections en utilisant le chemin complet avec "/" comme séparateurs. Par exemple:
fuego query countries/france/cities
Expliquons les requêtes par l'exemple. Tout d'abord, nous créerons une collection de lauréats du prix Nobel de physique,
fuego add nobel ' {"name": "Arthur Ashkin", "year": 2018, "birthplace": {"country":"USA", "city": "New York"}} '
fuego add nobel ' {"name": "Gerard Mourou", "year": 2018, "birthplace": {"country":"FRA", "city": "Albertville"}} '
fuego add nobel ' {"name": "Donna Strickland", "year": 2018, "birthplace": {"country":"CAN", "city": "Guelph"}} '
fuego add nobel ' {"name": "Rainer Weiss", "year": 2017, "birthplace": {"country":"DEU", "city": "Berlin"}} '
fuego add nobel ' {"name": "Kip Thorne", "year": 2017, "birthplace": {"country":"USA", "city": "Logan"}} '
fuego add nobel ' {"name": "Barry Barish", "year": 2017, "birthplace": {"country":"USA", "city": "Omaha"}} '
fuego add nobel ' {"name": "David Thouless", "year": 2016, "birthplace": {"country":"GBR", "city": "Bearsden"}} '
Nous pouvons interroger la collection complète:
fuego query nobel
# Prints all our nobel laureates like this:
# [
# {
# "CreateTime": "2019-02-26T02:39:45.293936Z",
# "Data": {
# "birthplace": {
# "city": "Bearsden",
# "country": "GBR"
# },
# "name": "David Thouless",
# "year": 2016
# },
# "ID": "BJseSVoBatOOt8gcwZWx",
# "ReadTime": "2019-02-26T02:55:19.419627Z",
# "UpdateTime": "2019-02-26T02:39:45.293936Z"
# },
# .... etc
Qui va chercher et afficher les documents de la collection, non filtrés. Par défaut, Fuego ne rapportera que 100 documents. Vous pouvez modifier la limite à l'aide de l'indicateur --limit
.
Vous pouvez également commander les résultats en utilisant les drapeaux --orderby
et --orderdir
. Par exemple, trier nos lauréats du prix Nobel par Pays of Origin, dans l'ordre croissant:
fuego query --orderby birthplace.country --orderdir ASC nobel
Vous pouvez ajouter des filtres, en utilisant les opérateurs pris en charge Firestore:
>, <, >=, <=, ==, !=, <in>, <not-in>, <array-contains> or <array-contains-any>
Vous pouvez combiner plusieurs filtres dans une seule requête. Par exemple, pour obtenir les lauréats Nobel 2018 des États-Unis:
fuego query nobel ' birthplace.country == "USA" ' ' year == 2018 '
qui imprimera:
[
{
"CreateTime" : " 2019-02-26T02:14:02.692077Z " ,
"Data" : {
"birthplace" : {
"city" : " New York " ,
"country" : " USA "
},
"name" : " Arthur Ashkin " ,
"year" : 2018
},
"ID" : " glHCUu7EZ3gkuDaVlXqv " ,
"ReadTime" : " 2019-02-26T03:00:15.576398Z " ,
"UpdateTime" : " 2019-02-26T02:59:55.889775Z "
}
]
Ou aux États-Unis et en Allemagne.
fuego query nobel ' birthplace.country <in> ["USA","DEU"] ' ' year == 2018 '
Disons que nous voulons trouver le Nobel le moins récent des États-Unis, nous pouvons écrire la requête suivante:
fuego query --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
Oups, nous obtenons l'erreur suivante du serveur, car notre requête a besoin d'un index pour fonctionner:
rpc error: code = FailedPrecondition desc = The query requires an index.
You can create it here:
https://console.firebase.google.com/project/myproject/database/firestore/indexes?create_index=EgVub2JlbBoWChJiaXJ0aH....
Après avoir créé l'index, nous réduisons la requête et maintenant nous obtenons:
[
{
"CreateTime" : " 2019-02-26T02:39:44.458647Z " ,
"Data" : {
"birthplace" : {
"city" : " Omaha " ,
"country" : " USA "
},
"name" : " Barry Barish " ,
"year" : 2017
},
"ID" : " ainH3nkOA2xusEBON2An " ,
"ReadTime" : " 2019-02-26T03:12:07.156643Z " ,
"UpdateTime" : " 2019-02-26T02:39:44.458647Z "
}
]
I Nos exemples précédents, tous les segments de la partie de chemin d'un filtre contenaient un alphanumérique ou le caractère _ et n'ont pas commencé avec un nombre. Lorsque ces conditions sont remplies, elles peuvent être écrites non cotées. Sinon, ils doivent être non clés.
fuego query weirdcollection ' really." ".strage." but valid ".fieldname == "even blank keys are valid" '
Quant aux valeurs, numériques, string, booléen (true ou false) et les valeurs d'horodatage sont prises en charge dans les filtres. Exemples de requêtes:
"Age> = 34", "name == 'Paul'", "Marié == True" et "Birthday == 1977-06-28T04: 00: 00Z"
Notez que les valeurs d'horodatage doivent utiliser le format RFC3339 et ne doivent pas être citées. Les valeurs booléennes sont représentées par les chaînes vraies et fausses non colées.
Les valeurs des tableaux doivent être exprimées comme dans l'exemple suivant. Remarquez que les articles sont séparés par l'espace:
fuego query cities ' name <in> ["bogota" "cali" "medellin"] '
Utilisez l'indicateur - sélectionnez pour demander explicitement les champs spécifiques que vous souhaitez récupérer (vous pouvez en définir beaucoup en utilisant plusieurs - Select)
fuego query --select name --select year --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
Si nécessaire, vous pouvez utiliser les paramètres de pagination Firestore pour paraître manuellement à travers les résultats. Combinant --limit avec les drapeaux --startat, --startafter, --endat et --endBefore, qui acceptent tous l'ID d'un document.
Vous pouvez faire des requêtes de groupe pour interroger toutes les sous-collections partageant un ID commun en utilisant le drapeau -g.
fuego add cities/france/landmarks ' {"name": "The Eiffel Tower"} '
fuego add cities/sf/landmarks ' {"name": "Golden Gate Bridge"} '
fuego query -g landmarks
Utilisation de base
fuego copy source target
Nous pouvons copier une collection et ses sous-collections
fuego copy countries/france/cities countries/germany/cities
Par défaut, les documents existants dans la collection cible seront ignorés. Si vous souhaitez écraser le document existant, utilisez simplement --Overwrite
fuego copy countries/france/cities countries/germany/cities --overwrite
De plus, en utilisant l'indicateur - Merge, laissez-nous utiliser le mode de fusion pour écraser les documents existants
fuego copy countries/france/cities countries/germany/cities --overwrite --merge
Nous pouvons copier un document et ses sous-collections.
fuego copy countries/france countries/germany
Paramètres - Merge et --overwrite peuvent également être utilisés pour spécifier le comportement de copie.
Nous pouvons avoir Firestore dans différents projets Google. Nous pouvons spécifier les informations d'identification du projet source en utilisant --src-credentials
(ou -sc
) et cible les informations d'identification du projet en utilisant --dest-credentials
(ou -dc
). La valeur par défaut des --src-credentials
et --dest-credentials
est notre projet de travail actuel.
fuego copy countries/france countries/germany --src-credentials ./project-a-key.json --dest-credentials ./project-b-key.json --overwrite --merge
fuego copy countries/france/cities countries/germany/cities --src-credentials ./project-a-key.json --dest-credentials ./project-b-key.json
Nous pouvons également avoir un diplôme qui a accès à différents projets. Nous pouvons spécifier l'ID du projet source par --src-projectid
(ou -sp
) et Target Project ID en utilisant --dest-projectid
(ou -dp
). La valeur par défaut de --src-prjectid
et --dest-prjectid
est l'ID de notre projet de travail actuel.
fuego copy countries/france countries/germany --src-projectid project-a --dest-projectid project-b --overwrite --merge
fuego copy countries/france/cities countries/germany/cities --dest-projectid prject-c
Voir le fichier de piratage pour des conseils sur la façon de contribuer.