Lea la documentación de la versión estable si solo desea usar FUEGO
Un cliente de Firestore de línea de comandos.
Descargue uno de los binarios precompilados del último lanzamiento. (compilaciones disponibles para Windows, Linux, Macintosh/Darwin)
Los usuarios de Linux pueden instalar FUEGO a través de Snap. Sin embargo, probablemente necesitará instalarlo usando - -Devmode para que pueda acceder a su archivo Google_Application_Credentials.
snap install fuego --devmode
Si se siente cómodo construyendo programas, puede construir FUEGO usted mismo usando Go:
git clone https://github.com/sgarciac/fuego.git
cd fuego
go build . # and 'go install .' if you want
./fuego --help
Necesitará un archivo de clave de cuenta de servicio para poder acceder a la base de datos Firestore de su proyecto. Para crear un archivo de clave privada de la cuenta de servicio, si no tiene uno, vaya a su consola de proyecto Firebase, luego al proyecto de proyecto y luego haga clic en la pestaña Cuentas de servicio y genere una nueva clave privada.
Una vez que tenga su archivo de clave de cuenta de servicio, FUEGO podrá encontrarlo utilizando una de las siguientes opciones:
--credentials
cada vez que ejecuta FUEGO, es decir: fuego --credentials ./my-account-service-private-key.json get mycollection mydocumentid
o
export GOOGLE_APPLICATION_CREDENTIALS=./my-account-service-private-key.json
fuego get mycollection mydocumentid
Las bases de datos Firestore pertenecen a proyectos. El archivo de credenciales de aplicaciones de Google generalmente define el proyecto en el que Firestore funcionará. Sin embargo, puede, si es necesario, definir el proyecto utilizando la opción global --projectid
.
Si necesita usar FUEGO con el emulador Firestore en lugar de una base de datos real de Firestore, configure el entorno Firestore_emulator_Host en algo apropiado (generalmente, Localhost: 8080). Nota : Al usar el emulador, es probable que no esté utilizando un archivo Google_Application_Credentials. Por lo tanto, no se definirá ningún proyecto. Puede establecer un proyecto utilizando la opción Global --projectid
, de lo contrario usará 'predeterminado' como el identificador del proyecto.
fuego collections
Devolverá la lista de colecciones del proyecto.
Puede agregar nuevos documentos, usando JSON:
fuego add people ' {"name": "sergio", "age": 41} '
# Rv7ZfnLQWprdXuulqMdf <- fuego prints the ID of the newly created document
De buscarlos, usando la identificación:
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"
# }
O buscarlos usando múltiples 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"
# }
# ]
También puede reemplazar un documento existente:
fuego set people/Rv7ZfnLQWprdXuulqMdf '{"name": "sergio", "age": 42}' # It's my birthday!
Nota : Podemos usar los argumentos collection-path document-id json-data
o document-path json-data
. Este es también el caso de los comandos Delete y GET.
Tanto en los comandos add
y set
, el argumento del documento puede ser una cadena JSON (si comienza con el carácter {
) o una ruta a un archivo JSON, es decir:
fuego add animals ./dog.json
Para eliminar un documento:
fuego delete people/Rv7ZfnLQWprdXuulqMdf
Nota: Esto no eliminará ninguna subcolección en el documento.
Para eliminar un documento que incluye subcolecciones, use el indicador --recursive, -r
. Usar la bandera -r
también eliminará los documentos faltantes. Un documento que falta es un documento que no existe pero tiene subdocumentos.
fuego delete -r people/Rv7ZfnLQWprdXuulqMdf
También es posible eliminar múltiples documentos sin transacción
fuego delete people Rv7ZfnLQWprdXuulqMdf,Rv7ZfnLQWprdXuulqMde
Eliminar un campo específico de un documento, se puede utilizar la bandera --field, -f
.
fuego delete people/Rv7ZfnLQWprdXuulqMdf -f age
Este comando eliminará el campo de edad de la ruta de doble duplicación.
Para actualizar un documento existente:
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"
# }
Nuestros ejemplos aquí usan solo JSON básico para representar documentos de Firestore. Sin embargo, los tipos de JSON no son suficientes para representar algunos de los tipos de Firestore, por ejemplo, geo-ubicaciones o marcas de tiempo.
Lea la documentación de los tipos si desea saber cómo FUEGO asigna documentos JSON a los documentos de Firestore y cómo expresar el sistema de tipo más avanzado utilizando nuestro 'JSON extendido'.
Puede trabajar en subcolecciones utilizando la ruta completa con "/" S como separadores. Por ejemplo:
fuego query countries/france/cities
Expliquemos consultas por ejemplo. Primero, crearemos una colección de laureados de física Nobel,
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"}} '
Podemos consultar la colección completa:
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
Que buscará y mostrará los documentos en la colección, sin filtrar. Por defecto, FUEGO obtendrá solo 100 documentos. Puede cambiar el límite usando la bandera --limit
.
También puede solicitar los resultados utilizando las banderas --orderby
y --orderdir
. Por ejemplo, para ordenar nuestros premios Nobel por país de origen, en orden ascendente:
fuego query --orderby birthplace.country --orderdir ASC nobel
Puede agregar filtros, utilizando los operadores compatibles con Firestore:
>, <, >=, <=, ==, !=, <in>, <not-in>, <array-contains> or <array-contains-any>
Puede combinar varios filtros en una sola consulta. Por ejemplo, para obtener los Premios Nobel 2018 de los Estados Unidos:
fuego query nobel ' birthplace.country == "USA" ' ' year == 2018 '
que imprimirá:
[
{
"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 "
}
]
O Estados Unidos y Alemania.
fuego query nobel ' birthplace.country <in> ["USA","DEU"] ' ' year == 2018 '
Digamos que queremos encontrar el Nobel menos reciente de los Estados Unidos, podemos escribir la siguiente consulta:
fuego query --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
Vaya, recibimos el siguiente error del servidor, porque nuestra consulta necesita un índice para funcionar:
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....
Después de crear el índice, volvemos a ejecutar la consulta y ahora obtenemos:
[
{
"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 "
}
]
En nuestros ejemplos anteriores, todos los segmentos de la parte de la ruta de un filtro contenían alfanuméricos o el carácter _ y no comenzaron con un número. Cuando se cumplen estas condiciones, se pueden escribir sin cotizar. De lo contrario, deben ser sin cotizar.
fuego query weirdcollection ' really." ".strage." but valid ".fieldname == "even blank keys are valid" '
En cuanto a los valores, los valores numéricos, de cadena, booleanos (verdaderos o falsos) y la marca de tiempo son admitidos en filtros. Ejemplos de consultas:
"Age> = 34", "Nombre == 'Paul'", "casado == verdadero" y "cumpleaños == 1977-06-28T04: 00: 00z"
Tenga en cuenta que los valores de las marcas de tiempo deben usar el formato RFC3339 y no deben cotizarse. Los valores booleanos están representados por las cadenas verdaderas y falsas no cotizadas.
Los valores de matrices deben expresarse como en el siguiente ejemplo. Observe que los elementos están separados por el espacio:
fuego query cities ' name <in> ["bogota" "cali" "medellin"] '
Use la bandera --selección para solicitar explícitamente los campos específicos que desea recuperar (puede definir muchos usando varios --select)
fuego query --select name --select year --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
Si es necesario, puede usar los parámetros de paginación de Firestore para la página manual a través de los resultados. Combinando --limit con las banderas --s -startat, - -startafter, --endat y --dborfore, que aceptan la identificación de un documento.
Puede hacer consultas grupales para consultar todas las subcolecciones que comparten una identificación común utilizando el indicador -g.
fuego add cities/france/landmarks ' {"name": "The Eiffel Tower"} '
fuego add cities/sf/landmarks ' {"name": "Golden Gate Bridge"} '
fuego query -g landmarks
Uso básico
fuego copy source target
Podemos copiar una colección y sus sub colecciones
fuego copy countries/france/cities countries/germany/cities
Por defecto, se omitirán los documentos existentes en la colección de destino. Si desea sobrescribir el documento existente, simplemente use -Overwrite
fuego copy countries/france/cities countries/germany/cities --overwrite
Además, el uso de Flag -Merge Permitamos usar el modo de fusión para sobrescribir los documentos existentes
fuego copy countries/france/cities countries/germany/cities --overwrite --merge
Podemos copiar un documento y sus sub colecciones.
fuego copy countries/france countries/germany
Los parámetros - -Merge y -Overwrite también se pueden usar para especificar el comportamiento de copia.
Podemos tener Firestore en diferentes proyectos de Google. Podemos especificar la credencial del proyecto fuente utilizando --src-credentials
(o -sc
) y la credencial de proyecto de destino utilizando --dest-credentials
(o -dc
). El valor predeterminado de --src-credentials
y --dest-credentials
es nuestro proyecto de trabajo actual.
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
También podemos tener una credencial que tenga acceso a diferentes proyectos. Podemos especificar la ID del proyecto de origen por --src-projectid
(o -sp
) e ID de proyecto de destino utilizando --dest-projectid
(o -dp
). El valor predeterminado de --src-prjectid
y --dest-prjectid
es la identificación de nuestro proyecto de trabajo actual.
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
Consulte el archivo de piratería para obtener alguna orientación sobre cómo contribuir.