文件收藏
当您将MySQL用作文档存储时,集合是架构中可以创建,列出和删除的容器。集合包含您可以添加,查找,更新和删除的JSON文档。
本节中的示例使用架构中的countryinfo
集合world_x
。有关设置world_x
模式的说明,请参见“JavaScript快速入门指南:文档存储的MySQL Shell”。
文件资料
在MySQL中,文档表示为JSON对象。在内部,它们以有效的二进制格式存储,从而可以快速查找和更新。
JavaScript的简单文档格式:
{field1:“值”,field2:10,“ field 3”:null}
文档数组由一组用逗号分隔并包含在[
和]
字符中的文档组成。
JavaScript的简单文档数组:
[{“名称”:“阿鲁巴”,“代码:”:“ ABW”},{“名称”:“安哥拉”,“代码:”:“ AGO”}]
MySQL在JSON文档中支持以下JavaScript值类型:
- 数字(整数和浮点数)
- 弦
- 布尔值(False和True)
- 空值
- 更多JSON值的数组
- 具有更多JSON值的嵌套(或嵌入式)对象
馆藏
集合是具有共同目的并可能共享一个或多个索引的文档的容器。每个集合都有一个唯一的名称,并且存在于单个架构中。
术语架构等效于数据库,这意味着与关系架构相对的一组数据库对象,用于对数据实施结构和约束。模式不会对集合中的文档强制执行一致性。
在此快速入门指南中:
基本对象包括:
对象形式 描述 db db
是分配给当前活动模式的全局变量。当您要对模式运行操作(例如,检索集合)时,请使用可用于db
变量的方法。db.getCollections() db.getCollections()返回模式中的集合列表。使用列表获取对集合对象的引用,对其进行迭代等等。 集合范围内的基本操作包括:
操作形式 描述 db.name.add()
该的add()方法插入一个文档或文档放到指定的集合列表。 db.name.find()
该发现()方法返回指定的集合中的部分或全部文件。 db.name.modify()
该修改()方法更新命名的集合中的文档。 db.name.remove()
该删除()方法删除一个文件或从指定收集的文件清单。
相关信息
- 有关一般概述,请参见使用集合。
- CRUD EBNF定义提供了完整的操作列表。
创建,列出和删除集合
在MySQL Shell中,您可以创建新集合,获取架构中现有集合的列表,并从架构中删除现有集合。集合名称区分大小写,每个集合名称必须唯一。
确认架构
要显示分配给架构变量的值,请发出:
mysql-js> db
如果架构值不是Schema:world_x
,则db
通过发出以下命令来设置变量:
mysql-js> \use world_x
创建收藏
要在现有架构中创建新集合,请使用db
对象的createCollection()
方法。以下示例创建一个flags
在world_x
架构中称为的集合。
mysql-js> db.createCollection("flags")
该方法返回一个收集对象。
<Collection:标志>
列出收藏
要显示world_x
架构中的所有集合,请使用db
对象的getCollections()
方法。当前连接的服务器返回的集合显示在括号之间。
mysql-js> db.getCollections() [ <Collection:countryinfo>, <Collection:flags> ]
删除收藏
要从架构中删除现有集合,请使用db
对象的dropCollection()
方法。例如,flags
要从当前模式中删除集合,请发出:
mysql-js> db.dropCollection("flags")
该dropCollection()
方法在MySQL Shell中也用于从架构中删除关系表。
使用集合
要在架构中使用集合,请使用db
全局对象访问当前架构。在此示例中,我们使用world_x
先前导入的架构和countryinfo
集合。因此,您发出的操作的格式为,其中是执行操作所依据的集合的名称。在以下示例中,对集合执行操作。db.collection_name.operation
collection_name
countryinfo
新增文件
使用该add()
方法可以将一个文档或文档列表插入现有集合中。将以下文档插入countryinfo
集合中。由于这是多行内容,因此按Enter键两次以插入文档。
mysql-js> db.countryinfo.add( { GNP: .6, IndepYear: 1967, Name: "Sealand", Code: "SEA", demographics: { LifeExpectancy: 79, Population: 27 }, geography: { Continent: "Europe", Region: "British Islands", SurfaceArea: 193 }, government: { GovernmentForm: "Monarchy", HeadOfState: "Michael Bates" } } )
该方法返回操作状态。您可以通过搜索文档来验证操作。例如:
mysql-js> db.countryinfo.find("Name = 'Sealand'") { "GNP": 0.6, "_id": "00005e2ff4af00000000000000f4", "Name": "Sealand", "Code:": "SEA", "IndepYear": 1967, "geography": { "Region": "British Islands", "Continent": "Europe", "SurfaceArea": 193 }, "government": { "HeadOfState": "Michael Bates", "GovernmentForm": "Monarchy" }, "demographics": { "Population": 27, "LifeExpectancy": 79 } }
请注意,除了添加文档时指定的字段以外,还有一个字段_id
。每个文档都需要一个名为的标识符字段_id
。_id
在同一集合中的所有文档中,该字段的值必须唯一。在MySQL 8.0.11及更高版本中,文档ID由服务器而非客户端生成,因此MySQL Shell不会自动设置_id
值。_id
如果文档不包含该_id
字段,则8.0.11或更高版本的MySQL服务器会设置一个值。8.0或更早版本的MySQL服务器未设置_id
在这种情况下,您必须明确指定它的值。如果不这样做,MySQL Shell将返回错误5115 文档缺少必填字段。有关更多信息,请参阅了解文档ID。
查找文档
您可以使用该find()
方法从架构中的集合查询并返回文档。MySQL Shell提供了其他方法,可以与该方法一起使用以find()
对返回的文档进行过滤和排序。
MySQL提供以下操作符来指定搜索条件:OR
(||
),(AND
),&&
,,XOR
,IS
,NOT
,BETWEEN
,IN
,LIKE
,!=
,<>
,>
,>=
,<
,<=
,&
,|
,<<
,>>
,+
,,-
,和。*
/
~
%
查找集合中的所有文档
要返回集合中的所有文档,请使用find()
不指定搜索条件的方法。例如,以下操作将返回countryinfo
集合中的所有文档。
mysql-js> db.countryinfo.find() [ { "GNP": 828, "Code:": "ABW", "Name": "Aruba", "IndepYear": null, "geography": { "Continent": "North America", "Region": "Caribbean", "SurfaceArea": 193 }, "government": { "GovernmentForm": "Nonmetropolitan Territory of The Netherlands", "HeadOfState": "Beatrix" } "demographics": { "LifeExpectancy": 78.4000015258789, "Population": 103000 }, ... } ] 240 documents in set (0.00 sec)
该方法产生的结果除集合中的所有文档外还包含操作信息。
空集(没有匹配的文档)将返回以下信息:
空置(0.00秒)
筛选搜寻
您可以在find()
方法中包括搜索条件。构成搜索条件的表达式的语法与传统的MySQL 函数和运算符相同。您必须将所有表达式括在引号中。为了简洁起见,某些示例不显示输出。
一个简单的搜索条件可以包括Name
字段和我们知道的文档中的值。以下示例返回一个文档:
mysql-js> db.countryinfo.find("Name = 'Australia'") [ { "GNP": 351182, "Code:": "AUS", "Name": "Australia", "IndepYear": 1901, "geography": { "Continent": "Oceania", "Region": "Australia and New Zealand", "SurfaceArea": 7741220 }, "government": { "GovernmentForm": "Constitutional Monarchy, Federation", "HeadOfState": "Elisabeth II" } "demographics": { "LifeExpectancy": 79.80000305175781, "Population": 18886000 }, } ]
以下示例搜索了GNP超过5000亿美元的所有国家。该countryinfo
集合措施国民生产总值中的万台。
mysql-js> db.countryinfo.find("GNP > 500000") ...[output removed] 10 documents in set (0.00 sec)
以下查询中的“人口”字段将嵌入人口统计对象内。要访问嵌入的字段,请使用人口统计和人口之间的时间间隔来确定关系。文档和字段名称区分大小写。
mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000") ...[output removed] 6 documents in set (0.00 sec)
以下表达式中的算术运算符用于查询人均GNP高于$ 30000的国家/地区。搜索条件可以包括算术运算符和大多数MySQL函数。
注意
countryinfo
集合中的七个文档的总体值为零。因此,警告消息出现在输出的末尾。
mysql-js> db.countryinfo.find("GNP*1000000/demographics.Population > 30000") ...[output removed] 9 documents in set, 7 warnings (0.00 sec) Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0 Warning (Code 1365): Division by 0
您可以使用bind()
方法将值与搜索条件分开。例如,不是指定硬编码的国家/地区名称为条件,而是替换由冒号组成的命名占位符,后跟以字母开头的名称,例如country。然后使用如下方法:bind(placeholder,value)
mysql-js> db.countryinfo.find("Name = :country").bind("country", "Italy") { "GNP": 1161755, "_id": "00005de917d8000000000000006a", "Code": "ITA", "Name": "Italy", "Airports": [], "IndepYear": 1861, "geography": { "Region": "Southern Europe", "Continent": "Europe", "SurfaceArea": 301316 }, "government": { "HeadOfState": "Carlo Azeglio Ciampi", "GovernmentForm": "Republic" }, "demographics": { "Population": 57680000, "LifeExpectancy": 79 } } 1 document in set (0.01 sec)注意
在程序中,绑定使您可以在表达式中指定占位符,这些占位符在执行前会用值填充,并且可以根据需要从自动转义中受益。
始终使用绑定来清理输入。避免在使用字符串连接的查询中引入值,这会产生无效的输入,并在某些情况下会导致安全问题。
您可以使用占位符和bind()
方法来创建保存的搜索,然后可以使用不同的值进行调用。例如,为一个国家创建保存的搜索:
mysql-js>var myFind = db.countryinfo.find("Name = :country") mysql-js> myFind.bind('country', 'France') { "GNP": 1424285, "_id": "00005de917d80000000000000048", "Code": "FRA", "Name": "France", "IndepYear": 843, "geography": { "Region": "Western Europe", "Continent": "Europe", "SurfaceArea": 551500 }, "government": { "HeadOfState": "Jacques Chirac", "GovernmentForm": "Republic" }, "demographics": { "Population": 59225700, "LifeExpectancy": 78.80000305175781 } } 1 document in set (0.0028 sec) mysql-js> myFind.bind('country', 'Germany') { "GNP": 2133367, "_id": "00005de917d80000000000000038", "Code": "DEU", "Name": "Germany", "IndepYear": 1955, "geography": { "Region": "Western Europe", "Continent": "Europe", "SurfaceArea": 357022 }, "government": { "HeadOfState": "Johannes Rau", "GovernmentForm": "Federal Republic" }, "demographics": { "Population": 82164700, "LifeExpectancy": 77.4000015258789 } } 1 document in set (0.0026 sec)
项目成果
您可以返回文档的特定字段,而不是返回所有字段。以下示例返回countryinfo
集合中与搜索条件匹配的所有文档的GNP和名称字段。
使用该fields()
方法传递要返回的字段列表。
mysql-js> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"]) [ { "GNP": 8510700, "Name": "United States" } ] 1 document in set (0.00 sec)
另外,您可以使用描述要返回的文档的表达式来更改返回的文档(添加,重命名,嵌套甚至计算新的字段值)。例如,使用以下表达式更改字段名称,以仅返回两个文档。
mysql-js> db.countryinfo.find().fields( mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).limit(2) { "Name": "ARUBA", "GNPPerCapita": 8038.834951456311 } { "Name": "AFGHANISTAN", "GNPPerCapita": 263.0281690140845 }
限制,排序和跳过结果
您可以应用limit()
,sort()
和skip()
方法来管理由返回文档的数量和顺序find()
的方法。
要指定结果集中包含的文档数,请在limit()
方法后附加一个值find()
。以下查询返回countryinfo
集合中的前五个文档。
mysql-js> db.countryinfo.find().limit(5) ... [output removed] 5 documents in set (0.00 sec)
要指定结果的顺序,请将sort()
方法附加到find()
方法中。将sort()
一个或多个字段的列表传递给该方法,以根据需要(可选desc
)按降序()或升序(asc
)属性进行排序。升序是默认的订单类型。
例如,以下查询按IndepYear字段对所有文档进行排序,然后按降序返回前八个文档。
mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8) ... [output removed] 8 documents in set (0.00 sec)
默认情况下,该limit()
方法从集合中的第一个文档开始。您可以使用该skip()
方法来更改起始文档。例如,要忽略第一个文档并返回与条件匹配的后八个文档,请将skip()
方法的值传递给 1。
mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1) ... [output removed] 8 documents in set (0.00 sec)
相关信息
- 在MySQL参考手册提供的功能和运营商的详细文档。
- 有关完整的语法定义,请参见CollectionFindFunction。
修改文档
您可以使用该modify()
方法来更新集合中的一个或多个文档。X DevAPI提供了其他方法,可以与以下modify()
方法一起使用:
- 设置和取消设置文档中的字段。
- 追加,插入和删除数组。
- 绑定,限制和排序要修改的文档。
设置和取消设置文档字段
该modify()
方法通过过滤集合以仅包括要修改的文档,然后将您指定的操作应用于这些文档来工作。
在下面的示例中,该modify()
方法使用搜索条件来标识要更改的文档,然后该set()
方法替换嵌套的人口统计对象内的两个值。
mysql-js> db.countryinfo.modify("Code = 'SEA'").set ( "demographics", {"LifeExpectancy": 78, "Population": 28})
修改文档后,使用该find()
方法来验证更改。
要从文档中删除内容,请使用modify()
和unset()
方法。例如,以下查询从符合搜索条件的文档中删除GNP。
mysql-js> db.countryinfo.modify("Name = 'Sealand'").unset("GNP")
使用该find()
方法来验证更改。
mysql-js> db.countryinfo.find("Name = 'Sealand'") { "_id": "00005e2ff4af00000000000000f4", "Name": "Sealand", "Code:": "SEA", "IndepYear": 1967, "geography": { "Region": "British Islands", "Continent": "Europe", "SurfaceArea": 193 }, "government": { "HeadOfState": "Michael Bates", "GovernmentForm": "Monarchy" }, "demographics": { "Population": 27, "LifeExpectancy": 79 } }
追加,插入和删除数组
追加到阵列字段,或插入或删除元素的数组中的元素,可以使用arrayAppend()
,arrayInsert()
或arrayDelete()
方法。以下示例修改了countryinfo
集合以启用对国际机场的跟踪。
第一个示例使用modify()
和set()
方法在所有文档中创建一个新的Airports字段。
警告在不指定搜索条件的情况下修改文档时请多加注意。此操作将修改集合中的所有文档。
mysql-js> db.countryinfo.modify("true").set ("Airports", [])
添加了Airports字段后,下一个示例使用该arrayAppend()
方法将新机场添加到其中一个文档中。下例中的$.Airports代表当前文档的Airports字段。
mysql-js> db.countryinfo.modify("Name = 'France'").arrayAppend("$.Airports", "ORY")
使用find()
参见更改。
mysql-js> db.countryinfo.find("Name = 'France'") { "GNP": 1424285, "_id": "00005de917d80000000000000048", "Code": "FRA", "Name": "France", "Airports": [ "ORY" ], "IndepYear": 843, "geography": { "Region": "Western Europe", "Continent": "Europe", "SurfaceArea": 551500 }, "government": { "HeadOfState": "Jacques Chirac", "GovernmentForm": "Republic" }, "demographics": { "Population": 59225700, "LifeExpectancy": 78.80000305175781 } }
要将元素插入数组中的其他位置,请使用arrayInsert()
方法指定要在路径表达式中插入的索引。在这种情况下,索引为0,即数组中的第一个元素。
mysql-js> db.countryinfo.modify("Name = 'France'").arrayInsert("$.Airports[0]", "CDG")
要从数组中删除元素,必须将要删除的元素arrayDelete()
的索引传递给该方法。
mysql-js> db.countryinfo.modify("Name = 'France'").arrayDelete("$.Airports[1]")
相关信息
- 在MySQL参考手册提供了帮助您查找并修改JSON值的说明。
- 有关完整的语法定义,请参见CollectionModifyFunction。
删除文档
您可以使用该remove()
方法从架构中的集合中删除部分或全部文档。X DevAPI提供了其他方法,可与该remove()
方法一起使用,以对要删除的文档进行过滤和排序。
使用条件删除文件
下面的示例将搜索条件传递给该remove()
方法。符合条件的所有文档将从countryinfo
集合中删除。在此示例中,一个文档符合条件。
mysql-js> db.countryinfo.remove("Code = 'SEA'")
删除第一个文档
要删除countryinfo
集合中的第一个文档,请使用limit()
值为1 的方法。
mysql-js> db.countryinfo.remove("true").limit(1)
删除订单中的最后一个文档
以下示例countryinfo
按国家/地区名称删除集合中的最后一个文档。
mysql-js> db.countryinfo.remove("true").sort(["Name desc"]).limit(1)
删除集合中的所有文档
您可以删除集合中的所有文档。为此,请使用该remove("true")
方法而不指定搜索条件。
警告在删除文档而未指定搜索条件时请格外小心。此操作将从集合中删除所有文档。
或者,使用该db.drop_collection('countryinfo')
操作删除countryinfo
集合。
相关信息
- 有关完整的语法定义,请参见CollectionRemoveFunction。
- 有关重新创建模式的说明,请参见“JavaScript快速入门指南:文档存储的MySQL Shell”
world_x
。
创建和删除索引
索引用于快速查找具有特定字段值的文档。没有索引,MySQL必须从第一个文档开始,然后通读整个集合以查找相关字段。馆藏越大,花费越多。如果集合很大,并且对特定字段的查询很普遍,则可以考虑在文档中的特定字段上创建索引。
例如,以下查询在“人口”字段上使用索引时效果更好:
mysql-js> db.countryinfo.find("demographics.Population < 100") ...[output removed] 8 documents in set (0.00 sec)
该createIndex()
方法创建一个索引,您可以使用指定使用哪些字段的JSON文档进行定义。本节是索引的高级概述。有关更多信息,请参见索引集合。
添加非唯一索引
要创建非唯一索引,请将索引名称和索引信息传递给createIndex()
方法。索引名称重复。
以下示例指定了一个名为的索引popul
,Population
该demographics
索引是根据对象的字段定义的,索引为Integer
数字值。最后一个参数指示该字段是否应要求NOT NULL
约束。如果值为false
,则该字段可以包含NULL
值。索引信息是一个JSON文档,其中包含要包含在索引中的一个或多个字段的详细信息。每个字段定义都必须包括该字段的完整文档路径,并指定字段的类型。
mysql-js> db.countryinfo.createIndex("popul", {fields: [{field: '$.demographics.Population', type: 'INTEGER'}]})
在这里,索引是使用整数数值创建的。提供了更多选项,包括与GeoJSON数据一起使用的选项。您还可以指定索引的类型,此处已省略,因为默认类型为“ index ”是合适的。
添加唯一索引
要创建唯一索引,请将索引名称,索引定义和索引类型“ unique ”传递给该createIndex()
方法。此示例显示了在国家/地区名称("Name"
)上创建的唯一索引,这是countryinfo
要索引的集合中的另一个常见字段。在索引字段描述中,"TEXT(40)"
代表要索引的字符数,并"required": True
指定该字段必须存在于文档中。
mysql-js> db.countryinfo.createIndex("name", {"fields": [{"field": "$.Name", "type": "TEXT(40)", "required": true}], "unique": true})
删除索引
要删除索引,请将索引名称传递给dropIndex()
方法。例如,您可以按以下方式删除“ popul ”索引:
mysql-js> db.countryinfo.dropIndex("popul")
相关信息
- 有关更多信息,请参见索引集合。
- 有关定义索引的JSON文档的更多信息,请参见定义索引。
- 有关完整的语法定义,请参见集合索引管理功能。