• MySQL中记录(Documents)的基本操作——添加记录和查找记录


    MySQL中,我们通常不称数据表中的记录为“文档”,而是称之为“行”或“记录”。记录表示为JSON对象。在内部,它们以高效的二进制格式存储,从而实现快速查找和更新。

    添加记录

    使用add()方法可以将一个记录或记录列表插入到现有集合中。将以下记录插入countryinfo集合。由于这是多行内容,请按Enter键两次以插入记录。

    1. mysql-js> db.countryinfo.add(
    2. {
    3. GNP: .6,
    4. IndepYear: 1967,
    5. Name: "Sealand",
    6. Code: "SEA",
    7. demographics: {
    8. LifeExpectancy: 79,
    9. Population: 27
    10. },
    11. geography: {
    12. Continent: "Europe",
    13. Region: "British Islands",
    14. SurfaceArea: 193
    15. },
    16. government: {
    17. GovernmentForm: "Monarchy",
    18. HeadOfState: "Michael Bates"
    19. }
    20. }
    21. )

    该方法返回操作的状态。您可以通过搜索记录来验证操作。例如

    1. mysql-js> db.countryinfo.find("Name = 'Sealand'")
    2. {
    3. "GNP": 0.6,
    4. "_id": "00005e2ff4af00000000000000f4",
    5. "Name": "Sealand",
    6. "Code:": "SEA",
    7. "IndepYear": 1967,
    8. "geography": {
    9. "Region": "British Islands",
    10. "Continent": "Europe",
    11. "SurfaceArea": 193
    12. },
    13. "government": {
    14. "HeadOfState": "Michael Bates",
    15. "GovernmentForm": "Monarchy"
    16. },
    17. "demographics": {
    18. "Population": 27,
    19. "LifeExpectancy": 79
    20. }
    21. }

    除了添加记录时指定的字段外,还有一个字段_id。每个记录都需要一个名为_id的标识符字段。_id字段的值在同一集合中的所有记录中必须是唯一的。在MySQL 8.0.11及更高版本中,记录id是由服务器生成的,而不是由客户端生成的,因此MySQL Shell不会自动设置_id值。如果记录不包含_id字段,则8.0.11或更高版本的MySQL服务器会设置_id值。在这种情况下,8.0版本或5.7版本的MySQL服务器不会设置_id值,因此必须显式指定。如果不这样做,MySQL Shell将返回错误5115记录缺少一个必填字段。

    查找记录

    您可以使用find()方法从模式中的集合中查询和返回记录。MySQL Shell提供了额外的方法与find()方法一起使用,以过滤和排序返回的记录。

    MySQL提供了以下运算符来指定搜索条件:OR(||)、AND(&&)、XOR、IS、NOT、BETWEEN、IN、LIKE、!=、<>、>、>=、<、<=、&、|、<<、>>、+、-、*、/、~、和 %。

    查找集合中的所有记录

    若要返回集合中的所有记录,请使用find()方法,而不指定搜索条件。例如,以下操作将返回countryinfo集合中的所有记录。

    1. mysql-js> db.countryinfo.find()
    2. [
    3. {
    4. "GNP": 828,
    5. "Code:": "ABW",
    6. "Name": "Aruba",
    7. "IndepYear": null,
    8. "geography": {
    9. "Continent": "North America",
    10. "Region": "Caribbean",
    11. "SurfaceArea": 193
    12. },
    13. "government": {
    14. "GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
    15. "HeadOfState": "Beatrix"
    16. }
    17. "demographics": {
    18. "LifeExpectancy": 78.4000015258789,
    19. "Population": 103000
    20. },
    21. ...
    22. }
    23. ]
    24. 240 documents in set (0.00 sec)

    该方法生成的结果除了包含集合中的所有记录之外,还包含操作信息。

    空集(没有匹配的记录)返回以下信息:

    Empty set (0.00 sec)
    筛选搜索

    您可以使用find()方法包含搜索条件。所有表达式都必须用引号括起来。为了简洁起见,有些示例不显示输出。

    一个简单的搜索条件可以由Name字段和一个我们知道在记录中的值组成。以下示例返回单个记录:

    1. mysql-js> db.countryinfo.find("Name = 'Australia'")
    2. [
    3. {
    4. "GNP": 351182,
    5. "Code:": "AUS",
    6. "Name": "Australia",
    7. "IndepYear": 1901,
    8. "geography": {
    9. "Continent": "Oceania",
    10. "Region": "Australia and New Zealand",
    11. "SurfaceArea": 7741220
    12. },
    13. "government": {
    14. "GovernmentForm": "Constitutional Monarchy, Federation",
    15. "HeadOfState": "Elisabeth II"
    16. }
    17. "demographics": {
    18. "LifeExpectancy": 79.80000305175781,
    19. "Population": 18886000
    20. },
    21. }
    22. ]

    以下示例搜索所有国民生产总值高于5000亿美元的国家。国家信息收集以百万为单位衡量国民生产总值。

    1. mysql-js> db.countryinfo.find("GNP > 500000")
    2. ...[output removed]
    3. 10 documents in set (0.00 sec)

    以下查询中的“人口”字段嵌入到人口统计对象中。要访问嵌入的字段,请使用人口统计和人口统计之间的时间段来确定关系。记录和字段名称区分大小写。

    1. mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
    2. ...[output removed]
    3. 6 documents in set (0.00 sec)

    以下表达式中的算术运算符用于查询人均国民生产总值高于30000美元的国家。搜索条件可以包括算术运算符和大多数MySQL函数。

    注意:countryinfo集合中有七个记录的总体值为零。因此,警告消息会出现在输出的末尾。

    1. mysql-js> db.countryinfo.find("GNP*1000000/demographics.Population > 30000")
    2. ...[output removed]
    3. 9 documents in set, 7 warnings (0.00 sec)
    4. Warning (Code 1365): Division by 0
    5. Warning (Code 1365): Division by 0
    6. Warning (Code 1365): Division by 0
    7. Warning (Code 1365): Division by 0
    8. Warning (Code 1365): Division by 0
    9. Warning (Code 1365): Division by 0
    10. Warning (Code 1365): Division by 0

    可以使用bind()方法将值与搜索条件分离。例如,不要指定硬编码的国家/地区名称作为条件,而是替换一个由冒号和以字母开头的名称(如国家/地区)组成的命名占位符。然后使用bind(占位符,value)方法,如下所示:

    1. mysql-js> db.countryinfo.find("Name = :country").bind("country", "Italy")
    2. {
    3. "GNP": 1161755,
    4. "_id": "00005de917d8000000000000006a",
    5. "Code": "ITA",
    6. "Name": "Italy",
    7. "Airports": [],
    8. "IndepYear": 1861,
    9. "geography": {
    10. "Region": "Southern Europe",
    11. "Continent": "Europe",
    12. "SurfaceArea": 301316
    13. },
    14. "government": {
    15. "HeadOfState": "Carlo Azeglio Ciampi",
    16. "GovernmentForm": "Republic"
    17. },
    18. "demographics": {
    19. "Population": 57680000,
    20. "LifeExpectancy": 79
    21. }
    22. }
    23. 1 document in set (0.01 sec)

    在程序中,绑定使您能够在表达式中指定占位符,这些占位符在执行前用值填充,并且可以从自动转义中受益(视情况而定)。

    始终使用绑定对输入进行清理。避免在使用字符串串联的查询中引入值,这可能会产生无效输入,在某些情况下还会导致安全问题。

    您可以使用占位符和bind()方法创建保存的搜索,然后使用不同的值调用这些搜索。例如,要创建已保存的国家/地区搜索:

    1. mysql-js> var myFind = db.countryinfo.find("Name = :country")
    2. mysql-js> myFind.bind('country', 'France')
    3. {
    4. "GNP": 1424285,
    5. "_id": "00005de917d80000000000000048",
    6. "Code": "FRA",
    7. "Name": "France",
    8. "IndepYear": 843,
    9. "geography": {
    10. "Region": "Western Europe",
    11. "Continent": "Europe",
    12. "SurfaceArea": 551500
    13. },
    14. "government": {
    15. "HeadOfState": "Jacques Chirac",
    16. "GovernmentForm": "Republic"
    17. },
    18. "demographics": {
    19. "Population": 59225700,
    20. "LifeExpectancy": 78.80000305175781
    21. }
    22. }
    23. 1 document in set (0.0028 sec)
    24. mysql-js> myFind.bind('country', 'Germany')
    25. {
    26. "GNP": 2133367,
    27. "_id": "00005de917d80000000000000038",
    28. "Code": "DEU",
    29. "Name": "Germany",
    30. "IndepYear": 1955,
    31. "geography": {
    32. "Region": "Western Europe",
    33. "Continent": "Europe",
    34. "SurfaceArea": 357022
    35. },
    36. "government": {
    37. "HeadOfState": "Johannes Rau",
    38. "GovernmentForm": "Federal Republic"
    39. },
    40. "demographics": {
    41. "Population": 82164700,
    42. "LifeExpectancy": 77.4000015258789
    43. }
    44. }
    45. 1 document in set (0.0026 sec)
    项目成果

    您可以返回记录的特定字段,而不是返回所有字段。以下示例返回countryinfo集合中与搜索条件匹配的所有记录的GNP和Name字段。

    使用fields()方法传递要返回的字段列表。

    1. mysql-js> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
    2. [
    3. {
    4. "GNP": 8510700,
    5. "Name": "United States"
    6. }
    7. ]
    8. 1 document in set (0.00 sec)

    此外,还可以通过表达式来描述想要返回的记录,并对这些返回的记录进行修改,比如添加、重命名、嵌套字段,甚至计算新的字段值。

    例如,使用以下表达式更改字段的名称以仅返回两个记录。

    1. mysql-js> db.countryinfo.find().fields(
    2. mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).limit(2)
    3. {
    4. "Name": "ARUBA",
    5. "GNPPerCapita": 8038.834951456311
    6. }
    7. {
    8. "Name": "AFGHANISTAN",
    9. "GNPPerCapita": 263.0281690140845
    10. }
    限制、排序和跳过结果

    您可以应用limit()、sort()和skip()方法来管理find()方法返回的记录的数量和顺序。

    要指定结果集中包含的记录数,请在find()方法后面附加一个值的limit()方法。以下查询返回countryinfo集合中的前五个记录。

    1. mysql-js> db.countryinfo.find().limit(5)
    2. ... [output removed]
    3. 5 documents in set (0.00 sec)

    若要对查询结果进行排序,可以在find()方法后附加sort()方法。你需要向sort()方法传递一个或多个字段名称的列表,用以指明排序的依据。同时,你还可以选择性地为每个字段指定排序方式,即升序(asc)或降序(desc)。若未明确指定,则默认采用升序排序。 

    例如,以下查询按IndepYear字段对所有记录进行排序,然后按降序返回前八个记录。

    1. mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
    2. ... [output removed]
    3. 8 documents in set (0.00 sec)

    limit()方法默认从集合中的第一个记录开始返回结果。如果你想改变起始的记录,可以使用skip()方法。例如,如果你想忽略第一个记录,并返回接下来符合条件的八个记录,你可以将1作为参数传递给skip()方法。

    1. mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
    2. ... [output removed]
    3. 8 documents in set (0.00 sec)
  • 相关阅读:
    java毕业设计校园便利店信息系统开发源码+lw文档+mybatis+系统+mysql数据库+调试
    基于ssm的美妆产品进销存管理系统的设计与开发-计算机毕业设计源码
    leetcode 739. Daily Temperatures 每日温度(中等)
    【Java数据结构】初步认识ArrayList与顺序表
    echarts入门图表可视化(基本介绍+示例代码)
    服务医学,基于目标检测模型实现细胞检测识别
    17. 从零开始编写一个类nginx工具, Rust中一些功能的实现
    解决appium或selenium使用时driver.find_element_by_xpath中间有删除线问题
    华为被迫开源!从认知到落地SpringBoot企业级实战手册(完整版)
    【Linux】linux | shell | 获取系统当前时间
  • 原文地址:https://blog.csdn.net/u011565038/article/details/140303512