MySQL8 中文参考(八十三)(2)https://developer.aliyun.com/article/1565956
提示
在程序内,绑定使您能够在表达式中指定占位符,在执行之前用值填充,并且可以从适当的自动转义中受益。
始终使用绑定来清理输入。避免使用字符串拼接在查询中引入值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。
您可以使用占位符和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 和 Name 字段。
使用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
)属性。升序顺序是默认的顺序类型。
例如,以下查询按独立年份字段对所有文档进行排序,然后按降序返回前八个文档。
mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8) ... [*output removed*] 8 documents in set (0.00 sec)
默认情况下,limit()
方法从集合中的第一个文档开始。您可以使用skip()
方法更改起始文档。例如,要忽略第一个文档并返回符合条件的下一个八个文档,请将值 1 传递给skip()
方法。
mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1) ... [*output removed*] 8 documents in set (0.00 sec)
相关信息
- MySQL 参考手册提供了有关函数和运算符的详细文档。
- 请参阅 CollectionFindFunction 获取完整的语法定义。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-modify.html
22.3.3.4 修改文档
您可以使用modify()
方法更新集合中的一个或多个文档。X DevAPI 提供了与modify()
方法一起使用的其他方法,以:
- 在文档内设置和取消设置字段。
- 追加、插入和删除数组。
- 绑定、限制和排序要修改的文档。
设置和取消设置文档字段
modify()
方法通过过滤集合以仅包括要修改的文档,然后将您指定的操作应用于这些文档来工作。
在下面的示例中,modify()
方法使用搜索条件标识要更改的文档,然后set()
方法替换了嵌套的 demographics 对象中的两个值。
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 以获取完整的语法定义。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-remove.html
22.3.3.5 删除文档
您可以使用remove()
方法从模式中的集合中删除一些或所有文档。X DevAPI 提供了与remove()
方法一起使用的其他方法,用于过滤和排序要删除的文档。
使用条件删除文档
以下示例向remove()
方法传递了搜索条件。匹配条件的所有文档都将从countryinfo
集合中删除。在此示例中,有一个文档符合条件。
mysql-js> db.countryinfo.remove("Code = 'SEA'")
删除第一个文档
要删除countryinfo
集合中的第一个文档,请使用值为 1 的limit()
方法。
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 以获取完整的语法定义。
- 请参阅第 22.3.2 节,“下载和导入 world_x 数据库”以获取重新创建
world_x
模式的说明。
原文:
dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-indexes-create.html
22.3.3.6 创建和删除索引
索引用于快速查找具有特定字段值的文档。没有索引,MySQL 必须从第一个文档开始,然后读取整个集合以查找相关字段。集合越大,成本越高。如果集合很大且对特定字段的查询很常见,则考虑在文档内的特定字段上创建索引。
例如,以下查询在 Population 字段上使用索引性能更好:
mysql-js> db.countryinfo.find("demographics.Population < 100") ...[*output removed*] 8 documents in set (0.00 sec)
createIndex()
方法创建一个可以用 JSON 文档定义的索引,该文档指定要使用的字段。本节是索引的高级概述。有关更多信息,请参见索引集合。
添加非唯一索引
要创建非唯一索引,请将索引名称和索引信息传递给createIndex()
方法。禁止重复索引名称。
以下示例指定了一个名为popul
的索引,针对demographics
对象中的Population
字段定义,索引为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 文档的更多信息,请参见定义索引。
- 有关完整语法定义,请参见集合索引管理函数。
MySQL8 中文参考(八十三)(4)https://developer.aliyun.com/article/1565959