MongoDB :第五章:MongoDB 插入更新刪除查詢文檔

MongoDB 插入文檔

本章節(jié)中我們將向大家介紹如何將數(shù)據(jù)插入到MongoDB的集合中。

文檔的數(shù)據(jù)結(jié)構和JSON基本一樣。

所有存儲在集合中的數(shù)據(jù)都是BSON格式。

BSON 是一種類似 JSON 的二進制形式的存儲格式,是 Binary JSON 的簡稱。
插入文檔

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法如下:

db.COLLECTION_NAME.insert(document)

實例

以下文檔可以存儲在 MongoDB 的 runoob 數(shù)據(jù)庫 的 col 集合中:

    >db.col.insert({title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    })

以上實例中 col 是我們的集合名,如果該集合不在該數(shù)據(jù)庫中, MongoDB 會自動創(chuàng)建該集合并插入文檔。

查看已插入文檔:

    > db.col.find()
    { "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
    >

我們也可以將數(shù)據(jù)定義為一個變量,如下所示:

    > document=({title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    });

執(zhí)行后顯示結(jié)果如下:

    {
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

執(zhí)行插入操作:

    > db.col.insert(document)
    WriteResult({ "nInserted" : 1 })
    >

插入文檔你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法類似于 insert() 方法。如果指定 _id 字段,則會更新該 _id 的數(shù)據(jù)。

MongoDB 刪除集合

MongoDB 更新文檔
 

2 篇筆記 寫筆記

       二少

      272***623@qq.com

      參考地址

    3.2 版本后還有以下幾種語法可用于插入文檔:
        db.collection.insertOne():向指定集合中插入一條文檔數(shù)據(jù)
        db.collection.insertMany():向指定集合中插入多條文檔數(shù)據(jù)

        #  插入單條數(shù)據(jù)
         
        > var document = db.collection.insertOne({"a": 3})
        > document
        {
                "acknowledged" : true,
                "insertedId" : ObjectId("571a218011a82a1d94c02333")
        }
         
        #  插入多條數(shù)據(jù)
        > var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
        > res
        {
                "acknowledged" : true,
                "insertedIds" : [
                        ObjectId("571a22a911a82a1d94c02337"),
                        ObjectId("571a22a911a82a1d94c02338")
                ]
        }

    二少

       二少

      272***623@qq.com

      參考地址
    2年前 (2017-07-12)

       Tffans

      897***246@qq.com

    一次插入多條數(shù)據(jù)

    1、先創(chuàng)建數(shù)組

    2、將數(shù)據(jù)放在數(shù)組中

    3、一次 insert 到集合中

        var arr = [];
         
        for(var i=1 ; i<=20000 ; i++){
            arr.push({num:i});
        }
        db.numbers.insert(arr);

MongoDB 更新文檔

MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓我們詳細來看下兩個函數(shù)的應用及其區(qū)別。
update() 方法

update() 方法用于更新已存在的文檔。語法格式如下:

    db.collection.update(
       <query>,
       <update>,
       {
         upsert: <boolean>,
         multi: <boolean>,
         writeConcern: <document>
       }
    )

參數(shù)說明:

    query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
    update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內(nèi)set后面的
    upsert : 可選,這個參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
    multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。
    writeConcern :可選,拋出異常的級別。

實例

我們在集合 col 中插入如下數(shù)據(jù):

    >db.col.insert({
        title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    })

接著我們通過 update() 方法來更新標題(title):

    >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 輸出信息
    > db.col.find().pretty()
    {
            "_id" : ObjectId("56064f89ade2f21f36b03136"),
            "title" : "MongoDB",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    >

可以看到標題(title)由原來的 "MongoDB 教程" 更新為了 "MongoDB"。

以上語句只會修改第一條發(fā)現(xiàn)的文檔,如果你要修改多條相同的文檔,則需要設置 multi 參數(shù)為 true。

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

save() 方法

save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:

    db.collection.save(
       <document>,
       {
         writeConcern: <document>
       }
    )

參數(shù)說明:

    document : 文檔數(shù)據(jù)。
    writeConcern :可選,拋出異常的級別。

實例

以下實例中我們替換了 _id 為 56064f89ade2f21f36b03136 的文檔數(shù)據(jù):

    >db.col.save({
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
        "by" : "Runoob",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "NoSQL"
        ],
        "likes" : 110
    })

替換成功后,我們可以通過 find() 命令來查看替換后的數(shù)據(jù)

    >db.col.find().pretty()
    {
            "_id" : ObjectId("56064f89ade2f21f36b03136"),
            "title" : "MongoDB",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "Runoob",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "NoSQL"
            ],
            "likes" : 110
    }
    >

更多實例

只更新第一條記錄:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只添加第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

全部添加進去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

全部更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一條記錄:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
MongoDB 刪除文檔

在前面的幾個章節(jié)中我們已經(jīng)學習了MongoDB中如何為集合添加數(shù)據(jù)和更新數(shù)據(jù)。在本章節(jié)中我們將繼續(xù)學習MongoDB集合的刪除。

MongoDB remove()函數(shù)是用來移除集合中的數(shù)據(jù)。

MongoDB數(shù)據(jù)更新可以使用update()函數(shù)。在執(zhí)行remove()函數(shù)前先執(zhí)行find()命令來判斷執(zhí)行的條件是否正確,這是一個比較好的習慣。
語法

remove() 方法的基本語法格式如下所示:

    db.collection.remove(
       <query>,
       <justOne>
    )

如果你的 MongoDB 是 2.6 版本以后的,語法格式如下:

    db.collection.remove(
       <query>,
       {
         justOne: <boolean>,
         writeConcern: <document>
       }
    )

參數(shù)說明:

    query :(可選)刪除的文檔的條件。
    justOne : (可選)如果設為 true 或 1,則只刪除一個文檔,如果不設置該參數(shù),或使用默認值 false,則刪除所有匹配條件的文檔。
    writeConcern :(可選)拋出異常的級別。

實例

以下文檔我們執(zhí)行兩次插入操作:

    >db.col.insert({title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb', 'database', 'NoSQL'],
        likes: 100
    })

使用 find() 函數(shù)查詢數(shù)據(jù):

    > db.col.find()
    { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
    { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

接下來我們移除 title 為 'MongoDB 教程' 的文檔:

    >db.col.remove({'title':'MongoDB 教程'})
    WriteResult({ "nRemoved" : 2 })           # 刪除了兩條數(shù)據(jù)
    >db.col.find()
    ……                                        # 沒有數(shù)據(jù)

如果你只想刪除第一條找到的記錄可以設置 justOne 為 1,如下所示:

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果你想刪除所有數(shù)據(jù),可以使用以下方式(類似常規(guī) SQL 的 truncate 命令):

    >db.col.remove({})
    >db.col.find()
    >

MongoDB 更新文檔

MongoDB 查詢文檔
 

2 篇筆記 寫筆記

       三國電視臺

      tre***3@126.com

    remove() 方法已經(jīng)過時了,現(xiàn)在官方推薦使用 deleteOne() 和 deleteMany() 方法。

    如刪除集合下全部文檔:

    db.inventory.deleteMany({})

    刪除 status 等于 A 的全部文檔:

    db.inventory.deleteMany({ status : "A" })

    刪除 status 等于 D 的一個文檔:

    db.inventory.deleteOne( { status: "D" } )

    三國電視臺

       三國電視臺

      tre***3@126.com
    2年前 (2017-09-22)

       sairre

      jsa***e@163.com

    remove() 方法 并不會真正釋放空間。

    需要繼續(xù)執(zhí)行 db.repairDatabase() 來回收磁盤空間。

        > db.repairDatabase()
        或者
        > db.runCommand({ repairDatabase: 1 })

 
MongoDB 查詢文檔

MongoDB 查詢文檔使用 find() 方法。

find() 方法以非結(jié)構化的方式來顯示所有文檔。
語法

MongoDB 查詢數(shù)據(jù)的語法格式如下:

db.collection.find(query, projection)

    query :可選,使用查詢操作符指定查詢條件
    projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數(shù)即可(默認省略)。

如果你需要以易讀的方式來讀取數(shù)據(jù),可以使用 pretty() 方法,語法格式如下:

>db.col.find().pretty()

pretty() 方法以格式化的方式來顯示所有文檔。
實例

以下實例我們查詢了集合 col 中的數(shù)據(jù):

    > db.col.find().pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

除了 find() 方法之外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較

如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過下表可以更好的理解 MongoDB 的條件語句查詢:
操作    格式    范例    RDBMS中的類似語句
等于    {<key>:<value>}    db.col.find({"by":"菜鳥教程"}).pretty()    where by = '菜鳥教程'
小于    {<key>:{$lt:<value>}}    db.col.find({"likes":{$lt:50}}).pretty()    where likes < 50
小于或等于    {<key>:{$lte:<value>}}    db.col.find({"likes":{$lte:50}}).pretty()    where likes <= 50
大于    {<key>:{$gt:<value>}}    db.col.find({"likes":{$gt:50}}).pretty()    where likes > 50
大于或等于    {<key>:{$gte:<value>}}    db.col.find({"likes":{$gte:50}}).pretty()    where likes >= 50
不等于    {<key>:{$ne:<value>}}    db.col.find({"likes":{$ne:50}}).pretty()    where likes != 50
MongoDB AND 條件

MongoDB 的 find() 方法可以傳入多個鍵(key),每個鍵(key)以逗號隔開,即常規(guī) SQL 的 AND 條件。

語法格式如下:

>db.col.find({key1:value1, key2:value2}).pretty()

實例

以下實例通過 by 和 title 鍵來查詢 菜鳥教程 中 MongoDB 教程 的數(shù)據(jù)

    > db.col.find({"by":"菜鳥教程", "title":"MongoDB 教程"}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

以上實例中類似于 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'
MongoDB OR 條件

MongoDB OR 條件語句使用了關鍵字 $or,語法格式如下:

    >db.col.find(
       {
          $or: [
             {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()

實例

以下實例中,我們演示了查詢鍵 by 值為 菜鳥教程 或鍵 title 值為 MongoDB 教程 的文檔。

    >db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    >

AND 和 OR 聯(lián)合使用

以下實例演示了 AND 和 OR 聯(lián)合使用,類似常規(guī) SQL 語句為: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'

    >db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

MongoDB 刪除文檔

MongoDB 條件操作符
 

3 篇筆記 寫筆記

       DisLido

    補充一下 projection 參數(shù)的使用方法

    db.collection.find(query, projection)

    若不指定 projection,則默認返回所有鍵,指定 projection 格式如下,有兩種模式

        db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其他鍵
        db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其他鍵

    _id 鍵默認返回,需要主動指定 _id:0 才會隱藏

    兩種模式不可混用(因為這樣的話無法推斷其他鍵是否應返回)

    db.collection.find(query, {title: 1, by: 0}) // 錯誤

    只能全1或全0,除了在inclusion模式時可以指定_id為0

    db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確

       pengll

    若不想指定查詢條件參數(shù) query 可以 用 {} 代替,但是需要指定 projection 參數(shù):

    querydb.collection.find({}, {title: 1})

       離別鉤

    如果是 qty 大于 50 小于 80 不能這樣寫:

    db.posts.find( {  qty: { $gt: 50 }, qty: { $lt: 80 } } )

    應該這樣:

    db.posts.find( {  qty: { $gt: 50 ,$lt: 80}} )

MongoDB 條件操作符

 
描述

條件操作符用于比較兩個表達式并從mongoDB集合中獲取數(shù)據(jù)。

在本章節(jié)中,我們將討論如何在MongoDB中使用條件操作符。

MongoDB中條件操作符有:

    (>) 大于 - $gt
    (<) 小于 - $lt
    (>=) 大于等于 - $gte
    (<= ) 小于等于 - $lte

我們使用的數(shù)據(jù)庫名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。

為了方便測試,我們可以先使用以下命令清空集合 "col" 的數(shù)據(jù):

db.col.remove({})

插入以下數(shù)據(jù)

    >db.col.insert({
        title: 'PHP 教程',
        description: 'PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['php'],
        likes: 200
    })

    >db.col.insert({title: 'Java 教程',
        description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['java'],
        likes: 150
    })

    >db.col.insert({title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb'],
        likes: 100
    })

使用find()命令查看數(shù)據(jù):

    > db.col.find()
    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

 
MongoDB (>) 大于操作符 - $gt

如果你想獲取 "col" 集合中 "likes" 大于 100 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$gt : 100}})

類似于SQL語句:

Select * from col where likes > 100;

輸出結(jié)果:

    > db.col.find({likes : {$gt : 100}})
    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    >

 
MongoDB(>=)大于等于操作符 - $gte

如果你想獲取"col"集合中 "likes" 大于等于 100 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$gte : 100}})

類似于SQL語句:

Select * from col where likes >=100;

輸出結(jié)果:

    > db.col.find({likes : {$gte : 100}})
    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
    >

 
MongoDB (<) 小于操作符 - $lt

如果你想獲取"col"集合中 "likes" 小于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt : 150}})

類似于SQL語句:

Select * from col where likes < 150;

輸出結(jié)果:

    > db.col.find({likes : {$lt : 150}})
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

 
MongoDB (<=) 小于等于操作符 - $lte

如果你想獲取"col"集合中 "likes" 小于等于 150 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lte : 150}})

類似于SQL語句:

Select * from col where likes <= 150;

輸出結(jié)果:

    > db.col.find({likes : {$lte : 150}})
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

 
MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt

如果你想獲取"col"集合中 "likes" 大于100,小于 200 的數(shù)據(jù),你可以使用以下命令:

db.col.find({likes : {$lt :200, $gt : 100}})

類似于SQL語句:

Select * from col where likes>100 AND  likes<200;

輸出結(jié)果:

    > db.col.find({likes : {$lt :200, $gt : 100}})
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    >

MongoDB 查詢文檔

MongoDB $type 操作符
 

2 篇筆記 寫筆記

       Mrt.L

      903***165@qq.com

    一些簡寫說明:

        $gt -------- greater than  >
         
        $gte --------- gt equal  >=
         
        $lt -------- less than  <
        $lte --------- lt equal  <=
        $ne ----------- not equal  !=
        $eq  --------  equal  =

    Mrt.L

       Mrt.L

      903***165@qq.com
    2年前 (2017-07-12)

       最初的夢想

      660***09@qq.com

    模糊查詢

    查詢 title 包含"教"字的文檔:

    db.col.find({title:/教/})

    查詢 title 字段以"教"字開頭的文檔:

    db.col.find({title:/^教/})

    查詢 titl e字段以"教"字結(jié)尾的文檔:

    db.col.find({title:/教$/})

MongoDB $type 操作符

 
描述

在本章節(jié)中,我們將繼續(xù)討論MongoDB中條件操作符 $type。

$type操作符是基于BSON類型來檢索集合中匹配的數(shù)據(jù)類型,并返回結(jié)果。

MongoDB 中可以使用的類型如下表所示:
 

 

 

我們使用的數(shù)據(jù)庫名稱為"runoob" 我們的集合名稱為"col",以下為我們插入的數(shù)據(jù)。

簡單的集合"col":

    >db.col.insert({
        title: 'PHP 教程',
        description: 'PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['php'],
        likes: 200
    })

    >db.col.insert({title: 'Java 教程',
        description: 'Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['java'],
        likes: 150
    })

    >db.col.insert({title: 'MongoDB 教程',
        description: 'MongoDB 是一個 Nosql 數(shù)據(jù)庫',
        by: '菜鳥教程',
        url: 'http://www.runoob.com',
        tags: ['mongodb'],
        likes: 100
    })

使用find()命令查看數(shù)據(jù):

    > db.col.find()
    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

 
MongoDB 操作符 - $type 實例

如果想獲取 "col" 集合中 title 為 String 的數(shù)據(jù),你可以使用以下命令:

    db.col.find({"title" : {$type : 2}})
    或
    db.col.find({"title" : {$type : 'string'}})

輸出結(jié)果為:

    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

MongoDB Limit與Skip方法
MongoDB Limit() 方法

如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語法

limit()方法基本語法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER)

實例

集合 col 中的數(shù)據(jù)如下:

    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

以下實例為顯示查詢文檔中的兩條記錄:

    > db.col.find({},{"title":1,_id:0}).limit(2)
    { "title" : "PHP 教程" }
    { "title" : "Java 教程" }
    >

注:如果你們沒有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
MongoDB Skip() 方法

我們除了可以使用limit()方法來讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個數(shù)字參數(shù)作為跳過的記錄條數(shù)。
語法

skip() 方法腳本語法格式如下:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

實例

以下實例只會顯示第二條文檔數(shù)據(jù)

    >db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
    { "title" : "Java 教程" }
    >

注:skip()方法默認參數(shù)為 0 。

MongoDB $type 操作符

MongoDB 排序
 

5 篇筆記 寫筆記

       天堂人_2008

      yan***n_xi@163.com

    db.col.find({},{"title":1,_id:0}).limit(2)

    補充說明:
        第一個 {} 放 where 條件,為空表示返回集合中所有文檔。
        第二個 {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)。
    天堂人_2008

       天堂人_2008

      yan***n_xi@163.com
    2年前 (2017-04-17)

       joyran

      xin***iyihan@126.com

    想要讀取從 10 條記錄后 100 條記錄,相當于 sql 中l(wèi)imit (10,100)。

    > db.COLLECTION_NAME.find().skip(10).limit(100)

    以上實例在集合中跳過前面 10 條返回 100 條數(shù)據(jù)。

    skip 和 limit 結(jié)合就能實現(xiàn)分頁。
    joyran

       joyran

      xin***iyihan@126.com
    2年前 (2017-04-20)

       dragon

      lib***uan_87@126.com

      參考地址

    補充說明skip和limit方法只適合小數(shù)據(jù)量分頁,如果是百萬級效率就會非常低,因為skip方法是一條條數(shù)據(jù)數(shù)過去的,建議使用where_limit

    在查看了一些資料之后,發(fā)現(xiàn)所有的資料都是這樣說的:

    不要輕易使用Skip來做查詢,否則數(shù)據(jù)量大了就會導致性能急劇下降,這是因為Skip是一條一條的數(shù)過來的,多了自然就慢了。

    這么說Skip就要避免使用了,那么如何避免呢?首先來回顧SQL分頁的后一種時間戳分頁方案,這種利用字段的有序性質(zhì),利用查詢來取數(shù)據(jù)的方式,可以直接避免掉了大量的數(shù)數(shù)。也就是說,如果能附帶上這樣的條件那查詢效率就會提高,事實上是這樣的么?我們來驗證一下:

    這里我們假設查詢第100001條數(shù)據(jù),這條數(shù)據(jù)的Amount值是:2399927,我們來寫兩條語句分別如下:

        b.test.sort({"amount":1}).skip(100000).limit(10)  //183ms
        db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10)  //53ms

    結(jié)果已經(jīng)附帶到注釋了,很明顯后者的性能是前者的三分之一,差距是非常大的。也印證了Skip效率差的理論。

    可以聯(lián)系郵箱 libaoyuan_87@126.com,互相學習。
    dragon

       dragon

      lib***uan_87@126.com

      參考地址
    2年前 (2017-09-14)

       niuyongjie

      niu***gjie@163.com

    limit(n) 是用來規(guī)定顯示的條數(shù),而 skip(n) 是用來在符合條件的記錄中從第一個記錄跳過的條數(shù),這兩個函數(shù)可以交換使用。

    比如:find({},{age:1,_id:0}).limit(2).skip(1),在符合條件的文檔中,要顯示兩條文檔,顯示的位置從跳過第一條記錄開始。這樣不是很好理解。

    如果寫成 find({},{age:1,_id:0}).skip(1).limit(2),在符合條件的文檔中,先跳過第一條文檔,然后顯示兩條文檔,這樣比較好理解。
    niuyongjie

       niuyongjie

      niu***gjie@163.com
    1年前 (2017-11-26)

       doc.z

      bin***real@163.com

    需要注意的是,此處的skip,sort,和limit三者執(zhí)行順序和位置無關,但是在聚合aggregate中使用的時候,具有管道流的特質(zhì),執(zhí)行順序是按照位置關系順序執(zhí)行的。

MongoDB 排序
MongoDB sort() 方法

在 MongoDB 中使用 sort() 方法對數(shù)據(jù)進行排序,sort() 方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
語法

sort()方法基本語法如下所示:

>db.COLLECTION_NAME.find().sort({KEY:1})

實例

col 集合中的數(shù)據(jù)如下:

    { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種創(chuàng)建動態(tài)交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
    { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
    { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數(shù)據(jù)庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

以下實例演示了 col 集合中的數(shù)據(jù)按字段 likes 的降序排列:

    >db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
    { "title" : "PHP 教程" }
    { "title" : "Java 教程" }
    { "title" : "MongoDB 教程" }
    >

MongoDB Limit與Skip方法

MongoDB 索引
 

1 篇筆記 寫筆記

       niuyongjie

      niu***gjie@163.com

    skip(), limilt(), sort()三個放在一起執(zhí)行的時候,執(zhí)行的順序是先 sort(), 然后是 skip(),最后是顯示的 limit()。

MongoDB 索引

索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時必須掃描集合中的每個文件并選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時,查詢可以要花費幾十秒甚至幾分鐘,這對網(wǎng)站的性能是非常致命的。

索引是特殊的數(shù)據(jù)結(jié)構,索引存儲在一個易于遍歷讀取的數(shù)據(jù)集合中,索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結(jié)構
createIndex() 方法

MongoDB使用 createIndex() 方法來創(chuàng)建索引。

    注意在 3.0.0 版本前創(chuàng)建索引方法為 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 還能用,但只是 createIndex() 的別名。

語法

createIndex()方法基本語法格式如下所示:

>db.collection.createIndex(keys, options)

語法中 Key 值為你要創(chuàng)建的索引字段,1 為指定按升序創(chuàng)建索引,如果你想按降序來創(chuàng)建索引指定為 -1 即可。
實例

    >db.col.createIndex({"title":1})
    >

createIndex() 方法中你也可以設置使用多個字段創(chuàng)建索引(關系型數(shù)據(jù)庫中稱作復合索引)。

    >db.col.createIndex({"title":1,"description":-1})
    >

createIndex() 接收可選參數(shù),可選參數(shù)列表如下:

 

 


實例

在后臺創(chuàng)建索引:

db.values.createIndex({open: 1, close: 1}, {background: true})

通過在創(chuàng)建索引時加 background:true 的選項,讓創(chuàng)建工作在后臺執(zhí)行

    1、查看集合索引

    db.col.getIndexes()

    2、查看集合索引大小

    db.col.totalIndexSize()

    3、刪除集合所有索引

    db.col.dropIndexes()

    4、刪除集合指定索引

    db.col.dropIndex("索引名稱")

    onroad

       onroad

      liu***910612@126.com
    5個月前 (11-20)

       靈仙羽圣

      664***680@qq.com

      參考地址

    利用 TTL 集合對存儲的數(shù)據(jù)進行失效時間設置:經(jīng)過指定的時間段后或在指定的時間點過期,MongoDB 獨立線程去清除數(shù)據(jù)。類似于設置定時自動刪除任務,可以清除歷史記錄或日志等前提條件,設置 Index 的關鍵字段為日期類型 new Date()。

    例如數(shù)據(jù)記錄中 createDate 為日期類型時:
        設置時間180秒后自動清除。
        設置在創(chuàng)建記錄后,180 秒左右刪除。

    db.col.createIndex({"createDate": 1},{expireAfterSeconds: 180})

    由記錄中設定日期點清除。

    設置 A 記錄在 2019 年 1 月 22 日晚上 11 點左右刪除,A 記錄中需添加 "ClearUpDate": new Date('Jan 22, 2019 23:00:00'),且 Index中expireAfterSeconds 設值為 0。

    db.col.createIndex({"ClearUpDate": 1},{expireAfterSeconds: 0})

    其他注意事項:
        索引關鍵字段必須是 Date 類型。
        非立即執(zhí)行:掃描 Document 過期數(shù)據(jù)并刪除是獨立線程執(zhí)行,默認 60s 掃描一次,刪除也不一定是立即刪除成功。
        單字段索引,混合索引不支持。