理解Cursor對象和查詢運算符 cursor對象 cursor對象相當於一個指針,可通過迭代它來訪問MongdoDB資料庫中的一組對象。 在使用 find() 方法查詢時,返回的並非實際文檔,而是一個Cursor對象,也就是一個指向第一個數據之前的指針。 Cursor對象內部存儲了一個指向當前位置 ...
理解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:表示查詢條件。
示例: