基本的文档查询操作
文章目录
本节提供了在 mongosh 中使用 db.collection.find()
方法的查询操作示例。 示例使用清单(inventory
)集合。 要填充清单集合,请运行以下命令:
db.inventory.insertMany([
{
item: "journal", qty: 25, size: {
h: 14, w: 21, uom: "cm" }, status: "A" },
{
item: "notebook", qty: 50, size: {
h: 8.5, w: 11, uom: "in" }, status: "A" },
{
item: "paper", qty: 100, size: {
h: 8.5, w: 11, uom: "in" }, status: "D" },
{
item: "planner", qty: 75, size: {
h: 22.85, w: 30, uom: "cm" }, status: "D" },
{
item: "postcard", qty: 45, size: {
h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
一、查询集合所有文档
要选择集合中的所有文档,请将一个空文档作为查询过滤器参数传递给 find 方法,或者不传递任何参数。
db.inventory.find( {
} ) //或者直接使用 db.inventory.find()
该操作对应如下 SQL 语句:
SELECT * FROM inventory
二、相等条件查询
要指定相等条件,请在查询过滤器文档中使用 <field>:<value>
表达式:
//为find()方法传入相等条件
{
<field1>: <value1>, ... }
以下示例从清单集合中选择状态等于'D'
的所有文档:
db.inventory.find( {
status: "D" } )
该操作对应如下 SQL 语句:
SELECT * FROM inventory WHERE status = "D"
三、使用查询运算符
查询过滤器可以使用查询运算符以下列形式指定条件:
{
<field1>: {
<operator1>: <value1> }, ... }
3.1 $in
in
运算符选择字段值等于指定数组中的任何值的文档。
如果该字段包含一个数组,则 $in
运算符选择其数组字段至少一个与指定数组中元素的值匹配的文档 。
要指定 $in
表达式,请使用以下原型:
{
field: {
$in: [<value1>, <value2>, ... <valueN> ] } }
以下示例从清单集合中检索状态等于'A'
或'D'
的所有文档:
db.inventory.find( {
status: {
$in: [ "A", "D" ] } } )
该操作对应如下 SQL 语句:
SELECT * FROM inventory WHERE status in ("A", "D")
3.2 $nin
$nin
选择所有符合以下要求的文档,其中:
- 字段值不在指定的数组中
- 字段不存在
如果该字段(field
)是一个数组,则 $nin
运算符选择field
数组中没有元素等于指定数组中元素的文档。
{
field: {
$nin: [ <value1>, <value2> ... <valueN> ] } }
以下示例从清单集合中检索状态不等于'A'
或'D'
的所有文档:
db.inventory.find( {
status: {
$nin: [ "A", "D" ] } } )
3.3 $gt 大于
gt
选择字段值大于(即>
)指定值的那些文档。要指定 $gt
表达式,请使用以下原型:
{
field: {
$gt: value } }
以下示例从清单集合中检索qty
属性大于50
的所有文档:
db.inventory.find( {
qty: {
$gt: 50 } } )
3.4 $gte 大于等于
gte
选择字段值大于或等于(即 >=
)指定值的文档,要指定$gte
表达式,请使用以下原型:
{
field: {
$gte: value } }
以下示例从清单集合中检索qty
属性大于等于50
(包括50)的所有文档:
db.inventory.find( {
qty: {
$gte: 50 } } )
3.5 $lt 小于
lt
选择字段值小于(即<)指定值的文档,要指定$lt
表达式,请使用原型:
{
field: {
$lt: value } }
以下示例从清单集合中检索qty
属性小于50
的所有文档:
db.inventory.find( {
qty: {
$lt: 50 } } )
3.6 $lte 小于等于
lte
选择字段值小于或等于(即<=)指定值的文档,要指定$lte
表达式,请使用原型:
{
field: {
$lte: value } }
以下示例从清单集合中检索qty
属性小于等于50
(包括50)的所有文档:
db.inventory.find( {
qty: {
$lte: 50 } } )
有关 MongoDB 查询运算符的完整列表,请参阅查询和投影运算符文档。
四、AND 条件查询
复合查询可以为集合文档中的多个字段指定条件。逻辑AND可以隐式地连接复合查询的子句,以便查询选择集合中匹配所有条件的文档。
以下示例检索库存集合中状态为'A'
且数量小于($lt
)30的所有文档:
db.inventory.find( {
status: "A", qty: {
$lt: 30 } } ) //隐式AND,语句并没有AND运算符
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" AND qty < 30
实际上,AND
运算也对应一种运算符$and
,我们可以使用如下写法显式的指明多个查询条件:
db.inventory.find( {
$and: [ {
status: 'A' }, {
qty: {
$lt: 30 } } ] } )
以上两种写法的作用完全相同,不过我们通常使用隐式的AND
查询方式,以便得到更加简洁、可读的代码。
五、OR 条件查询
使用$or
运算符,可以指定一个复合查询,该查询使用逻辑OR
连接每个子句,以便查询选择集合中至少匹配一个条件的文档。
以下示例检索集合中状态等于A
或数量小于($lt
)30的所有文档:
db.inventory.find( {
$or: [ {
status: "A" }, {
qty: {
$lt: 30 } } ] } )
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" OR qty < 30
六、AND/OR联合查询
在以下示例中,复合查询文档选择集合中状态为'A'
且数量小于($lt
)30或项目以字符'p'
开头的所有文档:
db.inventory.find( {
status: "A",
$or: [ {
qty: {
$lt: 30 } }, {
item: /^p/ } ]
} )
该操作对应于以下SQL语句:
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")