MongoDB學習(查詢文件和其他資料查詢操作)
理解Cursor物件和查詢運算子
cursor物件
cursor物件相當於一個指標,可通過迭代它來訪問MongdoDB資料庫中的一組物件。
在使用 find() 方法查詢時,返回的並非實際文件,而是一個Cursor物件,也就是一個指向第一個資料之前的指標。
Cursor物件內部儲存了一個指向當前位置的索引,可以保證每次讀取一個文件。在MongoDB中,有些操作隻影響Cursor中的當前文件,並將索引數加 1,而有些操作影響當前索引之後的所有文件。
查詢運算子
在進行查詢時,可以使用一些查詢運算子來進行查詢匹配。以來判斷文件中欄位的值是否符合指定的條件。類似與 sql 語句中 where 查詢後面的條件。
運算子 | 描述 | 示例 |
field:value | 與欄位值為value的文件匹配 | { name : "myName" } |
$gt | 與欄位值 大於 指定值的文件匹配 | { size : { $gt : 5 } } |
$gte | 與欄位值 大於等於 指定值的文件匹配 | { size : { $gte : 5 } } |
$in | 與欄位值 包含 在指定陣列中的文件匹配 | { like : { $in : [ "C","JAVA" ] } } |
$lt | 與欄位值 小於 指定值的文件匹配 | { size : { $lt : 5} } |
$lte | 與欄位值 小於等於 指定值的文件匹配 | { size : { $lte : 5 } } |
$ne | 與欄位值 不等於 指定值的文件匹配 | { name : {$ne : "badName"} } |
$nin | 與欄位值 不包含 在指定陣列中的文件匹配 | { name : { $nin : ["html","css"] } } |
$or | 使用 邏輯或 連線查詢字句,並返回符合任何一個字句條件的文件 | { $or : [ {size : {$lt : 5} }, {size : {$gt : 10} } ] } |
$and | 使用 邏輯與 連線查詢字句,並返回與兩個字句條件都匹配的文件 | { $and : [ { size : { $gt : 5 } },{ size : { $lt : 10 } } ] } |
$not | 反轉 查詢表示式的效果,返回與查詢表示式不匹配的文件 | { $not : { name : "myName" } } |
$nor | 使用 邏輯或非 連線查詢字句,返回與兩個字句都不匹配的文件 | { $nor : { size : { $gt : 5 } },{ size : { $lt : 0 } } } |
$exists | 值為 true 時匹配包含指定欄位的文件,為 false 時返回不包含該欄位的文件 | { name : { $exists : true } } |
$regex | 返回指定欄位的值與指定正則表示式匹配的文件 | { myString : { $regex : ' some.*exp ' } } |
$all | 返回指定陣列包含所有指定的元素的文件 | { word : { $all : [ 'a','b','c' ] } } |
$elemMatch | 返回指定的陣列欄位至少有一個元素與指定的條件都匹配的文件 | { myArr : { $elemMatch : { { value : { $gt : 5 } },{ size : { $lt : 10 } } } } } |
$size | 指定陣列的長度 | { myArr : { $size : 5 } } |
查詢文件
find() 方法
查詢集合中的文件可以用 find() 方法進行查詢,其語法為
find( query, projection)
- query :可選,使用查詢操作符指定查詢條件
- projection :可選,使用投影操作符指定返回的鍵。查詢時返回文件中所有鍵值, 只需省略該引數即可(預設省略)。
find() 方法返回一個 find()Cursor物件,表示與查詢條件匹配的文件。
function (query, fields, limit, skip, batchSize, options) { var cursor = new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip, batchSize, options || this.getQueryOptions()); { const session = this.getDB().getSession(); const readPreference = session._serverSession.client.getReadPreference(session); if (readPreference !== null) { cursor.readPref(readPreference.mode, readPreference.tags); } const readConcern = session._serverSession.client.getReadConcern(session); if (readConcern !== null) { cursor.readConcern(readConcern.level); } } return cursor; }
示例:
findOne()方法
它的用法與 find() 相同,只是 findOne() 只返回與查詢條件匹配的第一個文件。
示例:
根據多個欄位查詢文件
根據多個欄位進行查詢時,可以將多個查詢欄位放在一個文件中查詢,或者使用 $and 連線符進行連線。
注意:根據多個欄位查詢文件時,若將多個欄位放在多個文件中查詢時,只能根據第一個文件查詢出資料。第二個文件會作為另一個可選引數(投影)。
根據子文件查詢
根據子文件的欄位值進行查詢時,可用 find( { " 子文件.子文件欄位 " :value } ) 方法進行查詢。
示例:
1 { 2"_id" : ObjectId("5ca86917e8717d2b3f6e21e3"), 3"name" : "張三", 4"age" : 18, 5"father" : { 6"name" : "uzi", 7"age" : 24 8} 9 } 10 { 11"_id" : ObjectId("5ca86917e8717d2b3f6e21e4"), 12"name" : "李四", 13"age" : 19, 14"father" : { 15"name" : "letme", 16"age" : 25 17} 18 } 19 { 20"_id" : ObjectId("5ca86917e8717d2b3f6e21e5"), 21"name" : "王五", 22"age" : 20, 23"father" : { 24"name" : "zitai", 25"age" : 26 26} 27 } 集合中的資料
注意欄位值為null
在文件中儘量不要將值賦為null,因為進行null查詢時(例如name=null),不僅會返回name值為null的文件,也會將不包含name欄位的文件返回。所以應儘量避免使用null值,而應不包含這樣的欄位,這樣就可以使用 $exists運算子進行不包含查詢了。
其他資料查詢操作
計算文件數
查詢集合中的文件數時,可使用 db.collection_name.count() 進行計算。
若想查詢符合條件的文件數時,可使用 db.collection_name.find().count() 進行計算。
對結果集進行排序
在MongoDB中對結果集進行排序時,可以用Cursor物件的 sort() 方法。sort() 方法可以按照欄位的值進行升降排序。1 為升序, -1 為降序。
該方法返回的也是一個Cursor物件,可以繼續使用Cursor物件的其他方法,如limit() 等。
示例:
db.num.find().sort({a:1})
限制結果集的大小
在MongoDB中想要限制結果集的資料量,可以呼叫Cursor物件的 limit() 方法。他可以讓Cursor物件返回指定數量的文件。
該方法返回的也是一個Cursor物件,可以繼續使用CUrsor物件的其他方法。
limit(number) 方法接受一個數字型別引數,即要顯示的文件數。
db.collection_name.find().limit(number)
限制返回的欄位(投影)
為了限制文件檢索時返回的資料量,只獲得有用的資訊,拋除無效資訊,可以通過find() 方法的第二個可選引數 projection引數。
在MongdoDB中使用 find() 方法時,預設是顯示文件中的所有欄位。可以通過給欄位賦 1/true 表示包含,賦 -1/false 表示排除。
當欄位包含時,只會顯示包含的欄位;當欄位排除時,會顯示出排除外的所有欄位。 但是在同一個表示式中,不能同時指定包含和排除。
示例:
db.student.find({},{name:1})
結果集分頁
為減少返回的文件數,可以對結果集進行分頁。跳過部分文件,直接顯示後面的部分文件。
要進行分頁顯示可以用 Cursor物件的 limit() 方法和 skip() 方法。
skip() 方法可以指定在返回文件前跳過多少個文件。
db.collection_name.find().skip(number).limit(number)
對資料進行分頁時,可以呼叫方法 sort() 來確保資料的排列順序不變。
返回某個欄位的值
在MongoDB中,可以獲取一組文件中某個欄位的不同值列表。
Collection物件的 distinct() 方法可以找出指定欄位的不同值列表。這種方法的語法為:
db.collection_name.distinct( key,[query] )
- key:指定要獲得值的欄位
- query:表示查詢條件。
示例: