如果您只想使用fuego,请阅读稳定版本文档
命令行firestore客户端。
从最新版本中下载预编译的二进制文件之一。 (可用于Windows,Linux,Macintosh/Darwin的构建)
Linux用户可以通过SNAP安装Fuego。但是,您可能需要使用-devmode将其安装,以便它能够访问您的Google_application_credentials文件。
snap install fuego --devmode
如果您舒适地构建程序,可以使用GO自己建造Fuego:
git clone https://github.com/sgarciac/fuego.git
cd fuego
go build . # and 'go install .' if you want
./fuego --help
您需要一个服务帐户密钥文件,以便能够访问项目的Firestore数据库。要创建一个服务帐户的私有密钥文件,如果您没有一个文件,请转到您的Firebase Project Console,然后进行项目设置,然后单击“服务帐户”选项卡并生成新的私有密钥。
拥有服务帐户密钥文件后,Fuego将能够使用以下选项之一找到它:
--credentials
标志,即: fuego --credentials ./my-account-service-private-key.json get mycollection mydocumentid
或者
export GOOGLE_APPLICATION_CREDENTIALS=./my-account-service-private-key.json
fuego get mycollection mydocumentid
Firestore数据库属于项目。 Google应用程序凭据文件通常定义Firestore将要进行的项目。但是,如有必要,您可以使用全局选项--projectid
来定义项目。
如果您需要将Fuego与Firestore模拟器一起使用而不是真实的Firestore数据库,请将firestore_emulator_host环境变量设置为适当的东西(通常,Localhost:8080)。注意:使用模拟器时,您可能不使用Google_application_credentials文件。因此,将没有定义项目。您可以使用全局选项--projectid
设置一个项目,否则它将使用“默认”作为项目标识符。
fuego collections
将返回项目集合的列表。
您可以使用JSON添加新文档:
fuego add people ' {"name": "sergio", "age": 41} '
# Rv7ZfnLQWprdXuulqMdf <- fuego prints the ID of the newly created document
使用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"
# }
或使用多个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"
# }
# ]
您还可以替换现有文档:
fuego set people/Rv7ZfnLQWprdXuulqMdf '{"name": "sergio", "age": 42}' # It's my birthday!
注意:我们可以使用参数collection-path document-id json-data
或document-path json-data
。删除和get命令也是如此。
在两个add
和set
命令中,文档参数可以是JSON字符串(如果它以字符{
)开头,也可以是JSON文件的路径,即:
fuego add animals ./dog.json
删除文档:
fuego delete people/Rv7ZfnLQWprdXuulqMdf
注意:这不会删除文档下的任何子汇编。
要删除包括子策略在内的文档,请使用--recursive, -r
标志。使用-r
标志还将删除缺少的文档。缺少的文档是不存在但具有子文档的文档。
fuego delete -r people/Rv7ZfnLQWprdXuulqMdf
也可以删除多个文档而无需交易
fuego delete people Rv7ZfnLQWprdXuulqMdf,Rv7ZfnLQWprdXuulqMde
可以使用文档的特定字段,可以使用--field, -f
标志。
fuego delete people/Rv7ZfnLQWprdXuulqMdf -f age
此命令将从给定的doument路径中删除年龄字段。
更新现有文档:
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"
# }
我们在此处仅使用基本JSON代表Firestore文档。但是,JSON类型不足以代表一些Firestore类型,例如地理位置或时间戳。
如果您想知道Fuego如何将JSON文档映射到Firestore文档,以及如何使用我们的“扩展JSON”表达更高级的类型系统,请阅读类型文档。
您可以使用“/” s作为分离器的完整路径来处理子收集。例如:
fuego query countries/france/cities
让我们以示例解释查询。首先,我们将创建一系列物理诺贝尔奖获得者,
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"}} '
我们可以查询完整的集合:
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
它将在收藏中获取并显示文档,未经过滤。默认情况下,Fuego将仅获取100个文档。您可以使用--limit
标志更改限制。
您还可以使用--orderby
和--orderdir
标志订购结果。例如,按升序按原籍国分类我们的诺贝尔奖获得者:
fuego query --orderby birthplace.country --orderdir ASC nobel
您可以使用支持的操作员添加过滤器:
>, <, >=, <=, ==, !=, <in>, <not-in>, <array-contains> or <array-contains-any>
您可以将几个过滤器组合在一个查询中。例如,要获得美国的2018年诺贝尔奖获得者:
fuego query nobel ' birthplace.country == "USA" ' ' year == 2018 '
将要打印:
[
{
"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 "
}
]
或美国和德国。
fuego query nobel ' birthplace.country <in> ["USA","DEU"] ' ' year == 2018 '
假设我们想找到来自美国的最近期诺贝尔,我们可以编写以下查询:
fuego query --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
糟糕,我们从服务器中收到以下错误,因为我们的查询需要一个工作索引:
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....
创建索引后,我们重新运行查询,现在我们获得:
[
{
"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 "
}
]
我以前的示例,滤波器的所有路径部分的段中包含字母数字或_字符,并且没有以数字开头。当满足这种情况时,它们可以无名。否则,他们需要无名。
fuego query weirdcollection ' really." ".strage." but valid ".fieldname == "even blank keys are valid" '
至于值,在过滤器中支持数字,字符串,布尔值(true或fals或fals)和时间戳值。查询示例:
“ age> = 34”,“ name =='paul'”,“已婚== true”和“生日== 1977-06-28T04:00:00:00z”
请注意,时间戳值应使用RFC3339格式,不应引用。布尔值由未引用的真实和错误字符串表示。
数组值应如下示例中表示。请注意,项目被空间分开:
fuego query cities ' name <in> ["bogota" "cali" "medellin"] '
使用 - 选择标志明确要求您要检索的特定字段(您可以使用多个 - 选择)定义许多字段)
fuego query --select name --select year --limit 1 --orderby year --orderdir ASC nobel " birthplace.country == 'USA' "
如有必要,您可以使用Firestore分页参数通过结果手动页面。将限制与标志结合 - startat,-startafter,-endat和 - endbefore,它们都接受文档的ID。
您可以通过使用-g标志来查询组查询所有子汇编共享常见ID。
fuego add cities/france/landmarks ' {"name": "The Eiffel Tower"} '
fuego add cities/sf/landmarks ' {"name": "Golden Gate Bridge"} '
fuego query -g landmarks
基本用法
fuego copy source target
我们可以复制一个集合及其子收藏
fuego copy countries/france/cities countries/germany/cities
默认情况下,将跳过目标收集中的现有文档。如果要覆盖现有文档,只需使用-OverWrite
fuego copy countries/france/cities countries/germany/cities --overwrite
另外,使用标志 - 杂货让我们可以使用合并模式覆盖现有文档
fuego copy countries/france/cities countries/germany/cities --overwrite --merge
我们可以复制文档及其子集合。
fuego copy countries/france countries/germany
参数-Merge和-overWrite也可以用于指定复制行为。
我们可能在不同的Google项目中有Firestore。我们可以使用--src-credentials
(或-sc
)和目标项目凭据 - 使用--dest-credentials
(或-dc
)来指定源项目凭据。我们当前的工作项目是--src-credentials
和--dest-credentials
的默认值。
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
我们也可能拥有一个可以访问不同项目的凭据。我们可以通过使用--dest-projectid
--src-projectid
或-dp
)指定源项目ID(或-sp
)和目标项目ID。 --src-prjectid
和--dest-prjectid
的默认值是我们当前工作项目的ID。
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
有关如何贡献的指南,请参见黑客文件。