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:表示查詢條件。

  示例:

 

$type操作符

  $type操作符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。

  示例:

  想要獲取name值為string類型的數據,可以使用命令

db.aaa.find({"name":{$type:2}})
或
db.aaa.find({"name":{$type:'string'}})


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM