1. 程式人生 > >MongoDB 常用基本命令

MongoDB 常用基本命令

mongoDB 資料庫

mongoDB 資料庫概念

MongoDB的一個例項可以擁有一個或多個相互獨立的資料庫,每個資料庫都有自己的集合。

集合

集合可以看作是擁有動態模式的表。

文件

文件是MongoDB中基本的資料單元,類似關係型資料庫表的行。
文件是鍵值對的一個有序集合。

_id

每個文件都有個特殊的"_id",在文件所屬集合中是唯一的。

mongo命令 連結MongoDB 資料庫時 會進入 javascript shell

MongoDB自帶了一個功能強大的JavaScript Shell,可以用於管理或操作MongoDB。

資料庫命名規則

* 1:不能是空串。

* 2:不得含有/、\、?、$、空格、空字元等等,基本只能使用ASCII中的字母和數字 。

* 3:區分大小寫,建議全部小寫。

* 4:最多為64位元組。

* 5:不得使用保留的資料庫名,比如:admin,local,config 

注意:資料庫最終會成為檔案,資料庫名就是檔案的名稱。

集合名稱定義規則

  • 1: 不能是空串。

  • 2: 不能包含\0字元(空字元),這個字元表示集合名的結束,也不能包含”$”。

  • 3: 不能以”system.”開頭,這是為系統集合保留的字首

文件的key定義規則

* 1: 不能包含\0字元(空字元),這個字元表示鍵的結束。
* 2: “.”和“$”是被保留的,只能在特定環境下用。
* 3: 區分型別,同時也區分大小寫。
* 4: 鍵不能重複

注意:文件的鍵值對是有順序的,相同的鍵值對如果有不同順序的話,也是不同的文件。

資料庫操作

顯示現有的資料庫。

    show dbs

    leyue   0.078GB
    local   0.078GB
    mongo   0.078GB
    mycol   0.078GB
    mydb    0.078GB
    testdb  0.078GB

顯示當前使用的資料。


    db

切換當前使用的資料庫。

    use leyue

建立資料庫

    use 資料庫名稱
    db.集合名稱.insert({"name":"wang wu"})

    建立資料庫:MongoDB沒有專門建立資料庫的語句,可以使用“use
” 來使用某個資料庫,如果要使用 的資料庫不存在,那麼將會建立一個,會在真正向該庫加入文件後,儲存成為檔案。

刪除資料庫

    use 資料庫名稱
    db.dropDatabase()

集合的操作

建立集合

    建立集合:MongoDB中不用建立集合,因為沒有固定的結構,直接使用db.集合名稱.命令 來操作就可
以了。如果非要顯示建立集合的話,用:db.createCollecion(“集合名稱”);

顯示現有的集合

    use leyue

    show collections

insert 可以插入一個用{} 多條資料用[]

    db.userdatas.insert([ {"name":'lisan',"age":23},{"name":"wang wu","age":33} ])
1:MongoDB會為每個沒有“_id”欄位的文件自動新增一個”_id”欄位
2:每個Doc必須小於16MB

刪除文件 db.集合.remove()

    db.userdatas.remove({"name":"lisan"})

檢視資料庫 文件狀態 可以看到文件的個數大小 等等資訊

    資料庫: db.stats()
    文件:db.集合.stats
    db.stats()
    {
        "db" : "leyue",
        "collections" : 4,
        "objects" : 418,
        "avgObjSize" : 110.77511961722487,
        "dataSize" : 46304,
        "storageSize" : 192512,
        "numExtents" : 6,
        "indexes" : 2,
        "indexSize" : 32704,
        "fileSize" : 67108864,
        "nsSizeMB" : 16,
        "extentFreeList" : {
            "num" : 0,
            "totalSize" : 0
        },
        "dataFileVersion" : {
            "major" : 4,
            "minor" : 22
        },
        "ok" : 1
    }

    db.userdatas.stats()
    {
        "ns" : "leyue.userdatas",
        "count" : 11,
        "size" : 1040,
        "avgObjSize" : 94,
        "numExtents" : 1,
        "storageSize" : 8192,
        "lastExtentSize" : 8192,
        "paddingFactor" : 1,
        "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It  remains hard coded to 1.0 for compatibility only.",
        "userFlags" : 1,
        "capped" : false,
        "nindexes" : 1,
        "totalIndexSize" : 8176,
        "indexSizes" : {
            "_id_" : 8176
        },
        "ok" : 1
    }

檢視集合中所有的文件

    db.集合名稱.find();
    db.userdatas.find()
    { "_id" : ObjectId("59789a56bc629e73c4f09e1c"), "name" : "wang wu", "age" : 45 }
    { "_id" : ObjectId("59789a74bc629e73c4f09e1e"), "name" : "wang wu", "age" : 8 }
    { "_id" : ObjectId("59789ac0bc629e73c4f09e20"), "name" : "wang wu", "age" : 33 }
    { "_id" : ObjectId("597f357a09c84cf58880e40e"), "name" : "u1", "age" : 37 }

文件替換 db.集合名稱.update(條件,新的文件);只會修改符合條件的第一個文件。

db.test.update({"age":12},{"address":"北京","name":"老王"})

$set :指定一個欄位的值,如果欄位不存在,會建立一個.

db.test.update({"name":"u1"},{"$set":{"name":"u2"}},0,1)

$unset :刪掉某個欄位

db.test.update({"name":"u1"},{"$unset":{"address":1}},0,1)

$push:向已有陣列的末尾加入一個元素,要是沒有就新建一個數組。

db.test.update({"name":"u1"},{"$push":{"score":2}},0,1)

each:push來操作多個值

db.test.update({"name":"u1"},{"$push":{"score":{"$each":[4,5,6]}}})

save方法

如果文件存在就更新,不存在就新建,主要根據”_id”來判斷。

    db.test.save({"name":"li si"})

update

第三個引數 0 表示查詢不到,不增加一個文件 1表示查詢不到,增加文件
第四個引數 0 表示只更新第一個 1 更新所有查詢到的文件
1:只能用在$XXX的操作中
2:最好每次都顯示的指定update的第4個引數,以防止伺服器使用預設行為

find

find(條件,顯示的欄位)

db.userdatas.find({},{name:1,_id:0})

比較操作:lt,lte,gt,gte,$ne

    db.userdatas.find({age:{$gte:35}})
    30<=age<=35
    db.userdatas.find({age:{$lte:35,$gte:30}})

$and:包含多個條件,他們之間為and的關係

    db.userdatas.find({"name":"u5",age:{$gt:33}})
    db.userdatas.find({$and:[{"name":"u5"},{age:{$gt:33}}]})

$or :包含多個條件,他們之間為or的關係 ,$nor相當於or取反

     db.userdatas.find({$or:[{"name":"u5"},{age:{$gt:33}}]})

$not:用作其他條件之上,不能作為頂級查詢,後面可跟條件,正則

    db.userdatas.find({age:{$not:{$lt:35}}})
    db.userdatas.find({name:{$not:/wang/}})

$mod:將查詢的值除以第一個給定的值,如果餘數等於等二個值則匹配成功。

    db.userdatas.find({age:{$mod:[10,7]}})
    db.userdatas.find({age:{$not:{$mod:[10,7]}}})

in:,,nin為不包含

    db.userdatas.find({age:{$in:[33,35]}})
    db.userdatas.find({age:{$nin:[33,35]}})

$all:鍵需要匹配所有的值,用於陣列

    db.userdatas.find({score:{$all:[7,4]}})

$exists:檢查某個鍵是否存在,1表示存在,0表示不存在

    db.userdatas.find({"score":{$exists:1}})

null型別:不僅能匹配鍵的值為null,還匹配鍵不存在的情況

    db.userdatas.find({score:null})
    db.userdatas.find({name:{$in:[null],$exists:1}})   

正則

    MongoDB使用Perl相容的正則表示式(PCRE),
    比如: db.users.find({“name”:/sishuok/i}); 
    又比如: db.users.find({“name”:/^sishuok/});

陣列搜尋

單個元素匹配,就跟前面寫條件一樣,{key:value}

    db.userdatas.find({score:0})

多個元素匹配,使用$all, {key:{$all:[a,b]}},元素的順序無所謂

    db.userdatas.find({score:{$all:[2,0]}})

可以使用索引指定查詢陣列特定位置, {“key.索引號”:value}

    db.userdatas.find({"score.0":7})  索引從0開始

查詢某個長度的陣列,使用$size

    db.userdatas.find({"score":{$size:4}})

指定子集,使用$slice,正數是前面多少條,負數是尾部多少條,也可以指定偏

移量和要返回的元素數量,比如:$slice:[50,10]

    db.userdatas.find({},{"score":{$slice:2}})
    db.userdatas.find({},{"score":{$slice:-2}})
    db.userdatas.find({},{"score":{$slice:[1,1]}})

可以使用來指定符合條件的任意一個數組元素,如:{”users.”:1}

    db.userdatas.find({"score":{$in:[7,4]}},{"score.$":1,name:1})

$elemMatch:要求同時使用多個條件語句來對一個數組元素進行比較判斷

    db.userdatas.find({score:{$elemMatch:{$gt:8,$lt:12}}})

查詢內嵌文件

1:查詢整個內嵌文件與普通查詢是一樣的 。

2:如果要指定鍵值匹配,可以使用“.” 操作符,比如:{“name.first”:”a” ,“name.last”:”b”} 。

3:如果要正確的指定一組條件,那就需要使用$elemMatch,以實現對內嵌文件的多個鍵進行匹配操作。

插入一個文件:
    db.userdatas.update({"name":"u2"},{$set:{wendang:{"yw":80,"xw":90}}})
查詢文件:
     db.userdatas.find({"wendang.yw":80})

查詢記錄條數的命令:count

1,直接使用count()的話,得到的是整個記錄的條數。

2,如果要獲取按條件查詢後記錄的條數,需要指定count(true 或者非0 的數)

    db.userdatas.find().count()
    db.userdatas.find().limit(2).count(true)

限制返回的記錄條數的命令:limit(要返回的條數)

    db.userdatas.find().limit(2)

限制返回的記錄條數起點的命令:skip(從第幾條開始返回)

    db.userdatas.find().skip(0).limit(2)

排序的命令:sort({要排序的欄位:1為升序,-1為降序})

    db.userdatas.find().sort({age:-1})  
    db.userdatas.find().sort({age:-1}).limit(2)

分頁

分頁查詢:組合使用limit,skipt和sort skip 效率低
當然也可以使用其他方式來分頁,比如採用自定義的id,然後根據id來分頁

查詢給定鍵的所有不重複的資料,命令:distinct

     語法:db.runCommand({“distinct”:集合名,“key”:”獲得不重複資料的欄位”});
     db.runCommand({"distinct":"userdatas","key":"age"})

     db.runCommand({"distinct":"userdatas","key":"age"})
    {
        "waitedMS" : NumberLong(0),
        "values" : [
            45,
            8,
            33,
            37,
            78,
            32,
            30,
            20
        ],
        "stats" : {
            "n" : 11,
            "nscanned" : 0,
            "nscannedObjects" : 11,
            "timems" : 0,
            "planSummary" : "COLLSCAN"
        },
        "ok" : 1
    }

遊標

1:獲取遊標,示例如下:

var c = db.users.find();

2:循環遊標,可以用集合的方式,示例如下:

   while(c.hasNext()){
         printjson(c.next().文件鍵);
} 

3:也可以使用forEach來迴圈,示例如下:


   c.forEach(function(obj){
         print(obj);
});