# 查询文档

本文提供了使用mongo shell中[db.collection.find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find)方法查询的案例。案例中使用的**inventory**集合数据可以通过下面的语句产生。

```javascript
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方法中传一个**空文档**作为查询过滤条件。查询过滤参数确定选择条件：

```javascript
db.inventory.find( {} )
```

上述操作对应如下SQL语句：

```javascript
SELECT * FROM inventory
```

有关该方法语法的更多信息，请参阅 [find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find)。

## 等值查询

在[查询过滤文档](https://docs.mongodb.com/manual/core/document/#std-label-document-query-filter)中使用\*\*<字段>:<值>\*\*表达式实现等值查询：

```javascript
{ <field1>: <value1>, ... }
```

下面的案例返回inventory**集合中**status**等于**"D"\*\*的所有文档:

```javascript
db.inventory.find( { status: "D" } )
```

上述操作对应如下SQL语句：

```javascript
SELECT * FROM inventory WHERE status = "D"
```

## 查询条件中使用查询操作符

[查询过滤文档](https://docs.mongodb.com/manual/core/document/#std-label-document-query-filter)中可以使用[查询操作符](https://docs.mongodb.com/manual/reference/operator/query/)来指定多个条件，格式如下:

```javascript
{ <field1>: { <operator1>: <value1> }, ... }
```

下面的案例返回**inventory**集合中**status**等于\*\*"A"**或**"D"\*\*的所有文档。

```javascript
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
```

> Note:
>
> 尽管可以使用[$or](https://docs.mongodb.com/manual/reference/operator/query/or/#mongodb-query-op.-or)操作符来满足上述需求，但是在对相同字段进行等值检索的时候更建议使用[$in](https://docs.mongodb.com/manual/reference/operator/query/in/#mongodb-query-op.-in)。

上述操作对应如下SQL:

```javascript
SELECT * FROM inventory WHERE status in ("A", "D")
```

有关**MongoDB**查询运算符的完整列表，请参考[查询和映射操作符](https://docs.mongodb.com/v4.0/reference/operator/query/)

## AND条件

可以指定文档中的多个字段作为查询条件。在查询语句中使用AND连接多个查询条件来检索集合中满足所有查询条件的文档。

下面的案例返回**inventory**集合中**status**等于\*\*"A" **并且**qty\*\*小于([$lt](https://docs.mongodb.com/manual/reference/operator/query/lt/#mongodb-query-op.-lt))**30**的所有文档:

```javascript
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
```

上述操作对应如下SQL:

```javascript
SELECT * FROM inventory WHERE status = "A" AND qty < 30
```

关于MongoDB的比较操作符可以参考[比较操作符](https://docs.mongodb.com/v4.0/reference/operator/query-comparison/#query-selectors-comparison)

## OR条件

使用[$or](https://docs.mongodb.com/v4.0/reference/operator/query/or/#op._S_or)运算符，可以指定一个联合查询，该查询将每个子句与逻辑 OR 连接起来，以便查询选择集合中至少匹配一个条件的文档。

下面的案例返回inventory集合中**status**等于\*\*"A" **或者**qty\*\*小于([$lt](https://docs.mongodb.com/manual/reference/operator/query/lt/#mongodb-query-op.-lt))30的所有文档。

```javascript
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
```

上述操作对应如下SQL:

```javascript
SELECT * FROM inventory WHERE status = "A" OR qty < 30
```

> Note:
>
> 使用[比较操作符](https://docs.mongodb.com/v4.0/reference/operator/query-comparison/#query-selectors-comparison)的查询受[Type Bracketing](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#type-bracketing)的约束。

## 同时使用AND和OR条件

下面的案例返回inventory集合中**status**等于\*\*"A" **并且**qty**小于 (**[**$lt**](https://docs.mongodb.com/manual/reference/operator/query/lt/#mongodb-query-op.-lt)**) 30或者**item\*\* 是以**p**字符开头的所有文档。

```javascript
db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
```

上述操作对应如下SQL:

```javascript
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
```

> Note:
>
> MongoDB支持正则表达式操作符[$regex](https://docs.mongodb.com/manual/reference/operator/query/regex/#mongodb-query-op.-regex)来做字符串模式匹配。

## 其他查询教程

其他查询案例:

* [嵌套文档查询](https://docs.mongodb.com/manual/tutorial/query-embedded-documents/)
* [数组查询](https://docs.mongodb.com/manual/tutorial/query-arrays/)
* [数组中的嵌套文档查询](https://docs.mongodb.com/manual/tutorial/query-array-of-documents/)
* [查询语句中返回指定字段](https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/)
* [查询Null或者不存在的字段](https://docs.mongodb.com/manual/tutorial/query-for-null-fields/)

## 行为

**游标**

使用 [db.collection.find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find)方法返回检索到文档的一个[游标](https://docs.mongodb.com/v4.0/tutorial/iterate-a-cursor/)。

**读隔离**

*新增加于MongoDB3.2版本*

对于[副本集](https://docs.mongodb.com/manual/replication/)或者[分片副本集](https://docs.mongodb.com/manual/sharding/)的查询，读关注允许客户端选择读的隔离级别。更多的信息可以查看[Read Concern](https://docs.mongodb.com/v4.0/reference/read-concern/)

### 其它的方法

下面的方法也可以从集合中查询文档:

* [db.collection.findOne](https://docs.mongodb.com/v4.0/reference/method/db.collection.findOne/#db.collection.findOne)
* 在[聚合管道](https://docs.mongodb.com/v4.0/core/aggregation-pipeline/)中，[$match](https://docs.mongodb.com/v4.0/reference/operator/aggregation/match/#pipe._S_match)管道阶段提供了MongoDB的查询过滤。

> Note:
>
> [db.collection.findOne](https://docs.mongodb.com/v4.0/reference/method/db.collection.findOne/#db.collection.findOne) 方法提供了返回单个文档的读操作。
>
> 实际上，[db.collection.findOne](https://docs.mongodb.com/v4.0/reference/method/db.collection.findOne/#db.collection.findOne) 就是[db.collection.find()](https://docs.mongodb.com/v4.0/reference/method/db.collection.find/#db.collection.find) 方法后面加了个限制条数1。

原文链接：<https://docs.mongodb.com/manual/tutorial/query-documents/>

译者：张芷嘉


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mongoing.com/mongodb-crud-operations/query-documents.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
