您可以使用该find()
方法从模式中的集合中查询和返回文档。MySQL Shell 提供了额外的方法来与方法一起使用
find()
来过滤和排序返回的文档。
MySQL 提供了以下运算符来指定搜索条件:OR
( ||
),
AND
( &&
),
XOR
, IS
,
NOT
, BETWEEN
,
IN
, LIKE
,
!=
, <>
,
>
, >=
,
<
, <=
,
&
, |
,
<<
, >>
,
+
, -
,
*
, /
,
~
和%
。
要返回集合中的所有文档,请使用
find()
不指定搜索条件的方法。例如,以下操作返回countryinfo
集合中的所有文档。
mysql-py> 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第 12 章函数和运算符的语法相同。您必须将所有表达式括在引号中。为了简洁起见,一些示例不显示输出。
一个简单的搜索条件可以包含
Name
字段和我们知道在文档中的值。以下示例返回单个文档:
mysql-py> 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-py> db.countryinfo.find("GNP > 500000")
...[output removed]
10 documents in set (0.00 sec)
以下查询中的 Population 字段嵌入在人口统计对象中。要访问嵌入字段,请使用人口统计和人口之间的句点来标识关系。文档和字段名称区分大小写。
mysql-py> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
...[output removed]
6 documents in set (0.00 sec)
以下表达式中的算术运算符用于查询人均 GNP 高于 $30000 的国家。搜索条件可以包括算术运算符和大多数 MySQL 函数。
集合中的七个文档countryinfo
的总体值为零。因此警告消息出现在输出的末尾。
mysql-py> 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-py> 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-py> myFind = db.countryinfo.find("Name = :country")
mysql-py> 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-py> 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-py> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
[
{
"GNP": 8510700,
"Name": "United States"
}
]
1 document in set (0.00 sec)
此外,您可以使用描述要返回的文档的表达式来更改返回的文档——添加、重命名、嵌套甚至计算新的字段值。例如,使用以下表达式更改字段的名称以仅返回两个文档。
mysql-py> 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-py> db.countryinfo.find().limit(5)
... [output removed]
5 documents in set (0.00 sec)
要指定结果的顺序,请将方法附加
sort()
到
find()
方法。将一个或多个字段的列表传递给
sort()
方法,并根据需要传递降序 ( desc
) 或升序 ( asc
) 属性进行排序。升序是默认的订单类型。
例如,以下查询按 IndepYear 字段对所有文档进行排序,然后按降序返回前八个文档。
mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
... [output removed]
8 documents in set (0.00 sec)
默认情况下,该limit()
方法从集合中的第一个文档开始。您可以使用该
skip()
方法更改起始文件。例如,要忽略第一个文档并返回匹配条件的下八个文档,请将
skip()
值 1 传递给该方法。
mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
... [output removed]
8 documents in set (0.00 sec)
MySQL 参考手册提供了有关函数和运算符的详细文档 。
有关完整语法定义,请参阅CollectionFindFunction。