1. 程式人生 > 其它 >MongoDB 查詢文件

MongoDB 查詢文件

MongoDB 查詢文件

目錄
find 函式:查詢集合文件
db.collection.find(query, projection)
  • collection:替換成需要查詢的集合名稱
  • query:查詢條件(可選)使用查詢操作符指定查詢篩選器。若要返回集合中的所有文件,請省略此引數或傳遞一個空文件({})
  • projection:投影結果(可選)指定要在文件中返回與查詢篩選器匹配的欄位。要返回匹配文件中的所有欄位,請省略此引數

注意: 遊標(cursor)指向匹配查詢條件的文件。當find() 方法返回文件時,該方法實際上是將遊標返回到文件。

findOne 函式:檢視單個集合文件

查詢選擇器(查詢操作符)

比較操作符
操作符 說明
$eq 相等
$gt 大於
$gte 大於等於
$in 包含陣列元素
$lt 小於
$lte 小於等於
$ne 不等於指定值
$nin 不包含陣列元素
邏輯操作符
邏輯操作符 說明
$and 多個條件同時滿足
$not 反轉查詢表示式的效果,並返回與查詢表示式不匹配的文件。
$nor 用邏輯 NOR 連線查詢子句,返回所有不能匹配這兩個子句的文件。
$or 只要有一個條件成立即可
元素操作符
元素操作符 說明
$exists 判斷欄位是否存在
$type 判斷欄位的型別
求值操作符
求值操作符 說明
$mod 模運算
$regex 匹配正則表示式
$where 匹配JS表示式
  • $mod
{ field: { $mod: [ divisor, remainder ] }
}
  • $regex
{ <field>: { $regex: /parttern/,$options:'<options>' } }
{ <field>: { $regex: 'parttern',$options:'<options>' } }
{ <field>: { $regex: /parttern/<options> } }

注:要在 $in 查詢表示式中包含正則表示式,只能使用 JavaScript 正則表示式物件(即/pattern/)

  • $where

$where 後面跟 js 函式

> db.worker.find({$where:function() { return this.age>20;}})
陣列操作符
陣列操作符 說明
$all 匹配包含查詢中指定的所有元素的陣列
$elemMatch 如果陣列欄位中的元素匹配所有指定的 $elemMatch 條件則選擇文件
$size 如果陣列欄位是指定大小則選擇文件
  • $all

$all 要求陣列中的元素滿足所有條件

{ <field>: { $all: [ <value1> , <value2>... ] } }
  • elemMatch

$elemMatch 只要陣列中有一個元素滿足條件即可

{ <field>: { $elemMatch: { <query1>,<query2>, ... } } }
  • $size

投影(Projection)

投影引數決定在匹配的文件中返回哪些欄位。

{ field1: <value>, field2: <value> ... }

可以是下列任何一種

  • 1 或 true:顯示該欄位
  • 0 或 false:不顯示該欄位
  • 使用投影操作符的表示式

注:_id 預設是顯示的。可以手動設定不顯示

注:一個document文件中除了_id 欄位外,其他的所有欄位只要有一個欄位的投影是 0,沒有顯式給出的欄位的投影都是1;同理其他的所有欄位只要有一個欄位的投影是1,沒有顯式給出的欄位的投影都是0。

欄位投影的0和1不能混合使用

投影操作符
投影操作符 說明
$ 投影滿足查詢條件的陣列第一個元素
$elemMatch 投影符合指定 $elemMatch 條件的陣列中的第一個元素
$slice 限制從陣列中投影的元素數量。支援 skip 和 limit

$ 語法

db.collection.find(<array>:<value>... },{"<array>.$":1})
db.collection.find(<array.field>:<value>... },{"<array>.$":1})

注:使用了點表示法的欄位必須加上引號

· 點語法

點語法使用在陣列和巢狀文件中

陣列中的語法

"陣列.索引"

巢狀文件中的語法

"物件.欄位"

遊標(Cursor)

  • find 查詢返回的是遊標
  • 遊標指向查詢結果集的指標。
  • 客戶端可以遍歷遊標來檢索結果
  • 預設情況下,遊標在不活動10分鐘後超時
var cursor = db.worker.find()
使用遊標進行迭代
var cursor = db.worker.find()
while (cursor.hasNext()){
    printjson(cursor.next());
}
forEach 語法

迭代遊標,將 JavaScript 函式應用於遊標中的每個文件

db.collection.find().forEach(<function>)
skip() 語法
cursor.skip(<offset>)

在遊標上呼叫 cursor.skip() 方法來控制 MongoDB 開始返回結果的位置。這種方法在實現分頁結果時可能很有用。

注意:skip 的值不能是負數

limit() 語法

db.collection.find(<query>).limit(<number>)
  • 使用遊標上的 limit() 方法指定遊標將返回的最大文件數。limit() 類似於 MySQL 資料庫中的 limit 語句。

  • limit() 值為0 (即 limit(0) ) 等同於不設定限制。

  • limit 對於小於-231和大於231的值,limit()的行為沒有定義

skip+limit 組合

skip+limit 的順序一定是先 skip 再 limit,跟書寫順序無關

> db.worker.find().skip(1).limit(2)
# 等價於
> db.worker.find().limit(2).skip(1)

sort() 語法

cursor.sort(s)
  • s:document 型別,定義結果集排序規則(升、降序)

在 sort 引數中指定要排序的欄位或值為 1 或 -1 分別指定升序或降序排序。

在比較不同BSON型別的值時,MongoDB 使用以下比較順序,從最低到最高 :

1.	MinKey (internal type)
2.	Null
3.	Numbers (ints, longs, doubles, decimals)
4.	Symbol, String
5.	Object
6.	Array
7.	BinData
8.	ObjectId
9.	Boolean
10.	Date
11.	Timestamp
12.	Regular Expression
13.	MaxKey (internal type)

sort+skip+limit 組合

執行順序先 sort,然後 skip,最後 limit,跟書寫順寫無關。

count() 語法

db.collection.find(<query>).count()

count()方法有以下引數:

  • applySkipLimit:boolean 型別,預設為 false,可選的。指定是否在計數中考慮 cursor.skip() 和 cursor.limit() 方法的影響。預設情況下, count() 方法忽略 cursor.skip() 和 cursor.limit() 的效果,將 applySkipLimit 設定為 true,考慮這些方法的效果。

在分片叢集上,如果存在孤立文件,或者正在進行塊遷移,count() 可能導致不準確的計數。為了避免這些情況,在分片叢集上,可以使用 db. collections .aggregate() 方法。