本文的查詢是指存儲了5個手機數據後再查詢。存儲實現見文章:【Node.js】mongoose教程—存儲。
GitHub源碼鏈接:sodino#MongoDemo
Model與Query
Model.find()
方法會返回Query
對象。
Model.find()方法原型如下:
|
|
參數conditions
是必填項,用於設定查詢條件。
參數projection
是可選項,用於設定查詢結果的返回對象所包含的字段範圍。例如查詢的Phone
返回的結果對象只包含device
字段或去除device
字段。詳情見鏈接$project (aggregation)。
參數options
是可選項,用於對查詢的結果做功能處理,如排序sort
、數量限制limit
、查詢跳躍skip
等功能。詳情見鏈接Query.Options.
參數callback
是可選項,用於獲取查詢結果。
該方法執行後,返回Query
一個對象。Query
可以提供更加簡潔明瞭的查詢方法,這些查詢方法都與Model.find()
中的參數conditions
、projection
、options
幾乎存在着一一對應的功能關係。
如where() or() gte()
與conditions
、select()
與projection
、sort() limit()
與options
。Query
也有一些功能擴展函數,如計算count()
、排重distinct()
;也可以直接用於更新與刪除數據。
Query
推薦使用鏈式調用的代碼編寫方式,在鏈式代碼的末尾調用.exec(callback)
獲取查詢結果。
如以下代碼演示:
|
|
下面來演示一些查詢的示例:
查詢全部數據
|
|
控制檯輸出:
條件查詢
找出非智能手機:
|
|
控制檯輸出:
條件查詢—數組
在Phone中,有個apps
中爲包含一個name
字段的對象數組。定義如下:
|
|
如果需要查找安裝了哪些手機安裝了Radio
這個軟件,編寫條件爲{"apps.name" : "Radio"}
可以這麼查詢:
|
|
控制檯輸出如下:
組合條件查詢
在上面的兩個查詢演示了普通字段及數組下對象字段的指定條件查詢,但都是單條件查詢。
現在演示更加複雜的組合條件查詢。
即涉及到對比條件或邏輯條件的拼裝。
對比條件操作符(點擊查看詳情):
|
|
邏輯條件操作符(點擊查看詳情):
|
|
以上的操作符可用直接用在Model.find()
中的conditions
參數中;當然Query
類也提供了一一對應的查詢方法。
以下代碼演示組合條件: 查找中國或韓國廠商且價格處於[1000, 4000)範圍內的手機
可以有如下4種查詢方式,它們的查詢結果是等價的。
方法1和方法3在Model.find()
中condictions
參數直接使用運算操作符;
方法2和方法4使用Query.where().[chain_methods()].exec(callback)
方式。
兩種方法是等價的,愛用哪個用哪個吧。
在本例子中,可以發現$or
和$in
在某些場合是可以等價轉換的。
即以下兩種方式表達的意思都是指手機廠商是China或South Korea:
|
|
|
|
接下來看4種方法的代碼實現:
|
|
控制檯輸出如下: