#### 20.3.3.3 查找文档

[](<>)

您可以使用`找（）`从模式中的集合中查询和返回文档的方法。MySQL Shell 提供了额外的方法来使用`找（）`方法对返回的文档进行过滤和排序。

MySQL 提供以下运算符来指定搜索条件：`要么`(`||`),`和`(`&&`),`异或`,`是`,`不是`,`之间`,`在`,`喜欢`, `!=`, `<>`, `>`, `>=`, `<`, `<=`, `&`, `|`, `<<`, `>>`, `+`, `-`, `*`,`/`,`~`， 和`%`.

##### 查找集合中的所有文档

[](<>)

要返回集合中的所有文档，请使用`找（）`不指定搜索条件的方法。例如，下面的操作返回所有文档`国家信息`收藏。

```
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)
```

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

一个空集（没有匹配的文档）返回以下信息：

```
Empty set (0.00 sec)
```

##### 过滤搜索

[](<>)

您可以将搜索条件与`找（）`方法。构成搜索条件的表达式语法与传统 MySQL 相同[第 12 章，*函数和运算符*](functions.html).您必须将所有表达式括在引号中。为简洁起见，一些示例不显示输出。

一个简单的搜索条件可以包括`姓名`字段和我们知道的值在文档中。以下示例返回单个文档：

```
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 亿美元的所有国家/地区。这`国家信息`收集以百万为单位衡量国民生产总值。

```
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 函数。

笔记

七份文件在`国家信息`集合的总体值为零。因此，警告消息出现在输出的末尾。

```
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
```

您可以使用`绑定（）`方法。例如，不要将硬编码的国家名称指定为条件，而是替换为由冒号和以字母开头的名称组成的命名占位符，例如*国家*.然后使用`绑定（*`占位符`*, *`价值`*)`方法如下：

```
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)
```

提示

在程序中，绑定使您能够在表达式中指定占位符，这些占位符在执行前用值填充，并且可以根据需要从自动转义中受益。

始终使用绑定来清理输入。避免在使用字符串连接的查询中引入值，这会产生无效输入，并且在某些情况下会导致安全问题。

您可以使用占位符和`绑定（）`方法来创建保存的搜索，然后您可以使用不同的值调用这些搜索。例如，要创建一个国家/地区的已保存搜索：

```
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)
```

##### 项目成果

[](<>)

您可以返回文档的特定字段，而不是返回所有字段。以下示例返回所有文档的 GNP 和 Name 字段`国家信息`符合搜索条件的集合。

使用`字段（）`方法来传递要返回的字段列表。

```
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
}
```

##### 限制、排序和跳过结果

[](<>)

您可以申请`限制（）`,`种类（）`， 和`跳过（）`管理返回的文档的数量和顺序的方法`找（）`方法。

要指定结果集中包含的文档数，请附加`限制（）`具有值的方法`找（）`方法。以下查询返回前五个文档`国家信息`收藏。

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

要指定结果的顺序，请附加`种类（）`的方法`找（）`方法。传递给`种类（）`方法 一个或多个要排序的字段列表，以及可选的降序 (`描述`) 或升序 (`升序`) 属性视情况而定。升序是默认的订单类型。

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

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

默认情况下，`限制（）`方法从集合中的第一个文档开始。您可以使用`跳过（）`更改起始文档的方法。例如，要忽略第一个文档并返回符合条件的接下来的八个文档，传递给`跳过（）`方法值为 1。

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

##### 相关信息

-   这[MySQL 参考手册](functions.html)提供有关函数和运算符的详细文档。

-   看[集合查找函数](https://dev.mysql.com/doc/x-devapi-userguide/en/crud-ebnf-collection-crud-functions.html#crud-ebnf-collectionfindfunction)完整的语法定义。
