MongoDB只提供了`find`函數即可完成各種查詢,基本語法如下:
```sql
db.collection_name.find(query, projection)
query 查詢條件,可選
projection 投影操作符指定返回的鍵,即查詢的數據,可選
```
先插入測試文檔:
```js
> for(var i=1; i<=30; i++) db.customer.insert({id: i, name: "xi"+i, age: 100+i})
```
**1. 查詢全部**
```sql
> db.customer.find()
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab1"), "id" : 1, "name" : "xi1", "age" : 101 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab2"), "id" : 2, "name" : "xi2", "age" : 102 }
...
{ "_id" : ObjectId("6050ca0444f167bbabdf6ac4"), "id" : 20, "name" : "xi20", "age" : 120 }
Type "it" for more
# 或者
> db.customer.find({})
```
按照插入的順序返回前 20 個文檔,如果記錄總數比 20 大,則我們可以通過命令`it`獲取更多文檔。
```sql
# 默認為顯示前20條文檔
> DBQuery.shellBatchSize
20
# 在當前會話中顯示可以查詢前50條文檔
> DBQuery.shellBatchSize=50
50
> db.customer.find()
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab1"), "id" : 1, "name" : "xi1", "age" : 101 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab2"), "id" : 2, "name" : "xi2", "age" : 102 }
...
{ "_id" : ObjectId("6050ca0444f167bbabdf6ace"), "id" : 30, "name" : "xi30", "age" : 130 }
```
<br/>
**2. 以易讀方式查詢**
```sql
> db.customer.find().pretty()
{
"_id" : ObjectId("6050ca0444f167bbabdf6ab1"),
"id" : 1,
"name" : "xi1",
"age" : 101
}
{
"_id" : ObjectId("6050ca0444f167bbabdf6ab2"),
"id" : 2,
"name" : "xi2",
"age" : 102
}
```
<br/>
**3. 精確查詢**
```sql
# 查詢id=9的文檔
> db.customer.find({id:9})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab9"), "id" : 9, "name" : "xi9", "age" : 109 }
# 查詢 id=9 && name="xi9" 的文檔
> db.customer.find({id:9, name:"xi9"})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab9"), "id" : 9, "name" : "xi9", "age" : 109 }
```
<br/>
**4. 比較運算**
```sql
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于。單獨使用$ne,它也不會利用索引的優勢,反而會進行全表掃描
```
```sql
# 查詢id<5的文檔
> db.customer.find({id:{$lt:5}})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab1"), "id" : 1, "name" : "xi1", "age" : 101 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab2"), "id" : 2, "name" : "xi2", "age" : 102 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab3"), "id" : 3, "name" : "xi3", "age" : 103 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab4"), "id" : 4, "name" : "xi4", "age" : 104 }
# 查詢 5<id<10 的文檔
> db.customer.find({id:{$gt:5, $lt:10}})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab6"), "id" : 6, "name" : "xi6", "age" : 106 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab7"), "id" : 7, "name" : "xi7", "age" : 107 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab8"), "id" : 8, "name" : "xi8", "age" : 108 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab9"), "id" : 9, "name" : "xi9", "age" : 109 }
```
<br/>
**5. `$in`、`$nin`查詢**
```sql
# 查詢 id=1、id=3、id=5 的文檔
> db.customer.find({id:{$in:[1, 5, 3]}})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab1"), "id" : 1, "name" : "xi1", "age" : 101 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab3"), "id" : 3, "name" : "xi3", "age" : 103 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab5"), "id" : 5, "name" : "xi5", "age" : 105 }
# 查詢 id!=1、id!=3、id!=5 的文檔
# $nin 是一種比較低效的査詢選擇器,它會進行全表掃描,因此最好不要單獨使用$nin
> db.customer.find({id:{$nin:[1, 3, 5]}})
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab2"), "id" : 2, "name" : "xi2", "age" : 102 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab4"), "id" : 4, "name" : "xi4", "age" : 104 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab6"), "id" : 6, "name" : "xi6", "age" : 106 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ab7"), "id" : 7, "name" : "xi7", "age" : 107 }
```
<br/>
**6. 邏輯運算**
```sql
$or 或運算
$and 與運算
```
```sql
# 查詢id=11,或者age=119 的文檔
> db.customer.find({$or:[{id:11}, {age:119}]})
{ "_id" : ObjectId("6050ca0444f167bbabdf6abb"), "id" : 11, "name" : "xi11", "age" : 111 }
{ "_id" : ObjectId("6050ca0444f167bbabdf6ac3"), "id" : 19, "name" : "xi19", "age" : 119 }
# 查詢 id=11 并且 age=111 的文檔
> db.customer.find({$and:[{id:11}, {age:111}]})
{ "_id" : ObjectId("6050ca0444f167bbabdf6abb"), "id" : 11, "name" : "xi11", "age" : 111 }
```
<br/>
**7. 嵌套查詢**
```sql
{
"_id" : Objectld("6050dae844f167bbabdf6acf"),
"id" : 1,
"name" : "xiaohong",
"detail" : [
{ "sex" : "femle", "age" : 105},
{ "address" : "china", "post" : 5}
]
}
```
```sql
# 查詢 post=5 的文檔
> db.customer.find({'detail.1.post': 5}).pretty()
{
"_id" : ObjectId("6050dae844f167bbabdf6acf"),
"id" : 1,
"name" : "xiaohong",
"detail" : [
{
"sex" : "femle",
"age" : 105
},
{
"address" : "china",
"post" : 5
}
]
}
```
<br/>
**8. 投影查詢**
相當于select id, name from ... ,只查詢指定的字段。
```sql
# _id:0、id:1,0表示不查詢,1查詢
> db.customer.find({'detail.1.post':5}, {_id:0, id:1, name: 1})
{ "id" : 1, "name" : "xiaohong" }
```
<br/>
**8. 數組查詢**
```json
{
"_id" : 4,
"AttributeName" : "material",
"AttributeValue":["牛仔","織錦","雷紡","簾絲"],
"IsOptional" : 1
},
{
"_id" : 5,
"AttributeName" : "version",
"AttributeValue":["收腰型","修身型","直筒型","寬松型","其他"],
"IsOptional":1
}
```
```sql
# 精確匹配數組
> db.customer.find({"AttributeValue": ["牛仔","織錦","雷紡","簾絲"]}).pretty()
{
"_id" : 4,
"AttributeName" : "material",
"AttributeValue" : [
"牛仔",
"織錦",
"雷紡",
"簾絲"
],
"IsOptional" : 1
}
# 匹配數組中的一個值
> db.customer.find({"AttributeValue": "收腰型"}).pretty()
{
"_id" : 5,
"AttributeName" : "version",
"AttributeValue" : [
"收腰型",
"修身型",
"直筒型",
"寬松型",
"其他"
],
"IsOptional" : 1
}
# 匹配數組指定位置的值
# .0 就是數組的第0個元素的值
> db.customer.find({"AttributeValue.0": "收腰型"}).pretty()
{
"_id" : 5,
"AttributeName" : "version",
"AttributeValue" : [
"收腰型",
"修身型",
"直筒型",
"寬松型",
"其他"
],
"IsOptional" : 1
}
```
- MySQL
- MySQL是什么
- MySQL環境搭建
- centos7-MySQL8
- windows-MySQL8
- 數據庫軟件
- sqlyog軟件安裝
- navicat軟件安裝
- powerDesigner軟件安裝
- RDBMS術語
- SQL語句組成
- 數據庫系統組成
- 數據庫操作
- 數據表操作
- 查詢語句
- 基本語法
- 子查詢
- 表連接
- 查詢語句執行順序
- 事務
- 事務是什么
- 事務的作用
- 事務的4個特性
- 事務隔離級別
- 事務的實現
- 索引
- 索引的作用
- 索引操作
- 存儲引擎
- 備份與恢復
- 視圖
- 視圖是什么
- 視圖的作用
- 創建視圖
- 查看視圖
- 更改視圖
- DML操作視圖
- 刪除視圖
- 存儲過程與函數
- 過程與函數是什么
- 存儲過程操作
- 定義存儲過程
- 調用存儲過程
- 查看存儲過程
- 刪除存儲過程
- 修改存儲過程
- 函數操作
- 過程與函數區別
- 流程控制
- if語句
- case語句
- while循環語句
- repeat循環語句
- loop循環語句
- 變量
- 處理程序
- 光標
- Redis
- 簡介
- 下載與安裝
- 命令操作redis數據庫
- 通用命令
- 數據操作
- 持久化
- Windows上的持久化操作
- 數據庫設計
- 數據庫設計過程
- ER模型圖
- MongoDB
- MongoDB是什么?
- MongoDB特性
- MongoDB 數據模型
- 安裝MongoDB
- MongoDB認證
- Database操作
- Collection操作
- Document操作
- 插入
- 查詢
- 更新
- 刪除
- buckWrite
- MongoDB索引
- 副本集
- 聚焦分析
- 事務管理
- 寫關注
- 讀關注