Mongodb數據庫常用指令歸納整理(詳解)

廢話不多說,直接就是對mongodb執行增刪改查操作了。
首先需要鏈接到對應的用戶賬戶,獲取相關的操作權限:
在這裏插入圖片描述

插入技巧

簡單插入命令

db.test.insert({
    title:'測試標題',
    author:'文章作者',
    createTime: new Date()
    })

mongodb裏面的創建時間可以通過new Date函數來獲取到。
插入數據的時候,背後發生了什麼?
首先會檢查是否有包含_id,沒有的話,就會自動用objectid創建。
插入的單個文檔數據大小是否有超過16m大小。(mongodb爲了方式過大的文檔數據對數據結構造成影響,會有這種限制)

mongodb如果沒有開啓安全模式的話,每次操作的背後都不會返回對應的數值響應。

複雜對象插入
針對比較複雜的對象插入,我們可以藉助mongodb的document對象封裝進行數據插入:


document=({
    title:'標題2',
    author:'作者2',
    createTime:new Date()
    });
db.test.insert(document)

插入多條數據信息

var document0=({
    title:'標題0',
    author:'作者2',
    createTime:new Date()
});
var document1=({
    title:'標題3',
    author:'作者2',
    createTime:new Date()
});
var document2=({
    title:'標題4',
    author:'作者2',
    createTime:new Date()
});
db.test.insertMany(
      [document1,document2]  
        );

如果在測試環境需要插入數據的話,可以考慮這麼操作:

var arr=[];
for(var i=1;i<=5;i++){
        arr.push({
    "title" : "標題"+i,
    "author" : "作者2",
    "createTime" : new Date()
    });
};
db.test.insert(arr);

更新技巧

更新單獨一個數據
這裏的 ‘標題1’ 是指條件,後邊的set是指更新之後的數據內容

db.test.update(
        {'title':'標題1'},{$set:{'title':'MongodbTest'}}
)

更新批量數據

db.test.update(
        {'title':'MongodbTest'},{$set:{'title':'MongodbTest2'}},{multi:true}
)

特殊更新—替換
有些時候我們會需要對數據結構的內容做調整,如下圖
在這裏插入圖片描述

這個時候可以通過編寫javascript來實現:
具體編寫腳本如下:

var item=db.test.findOne({"_id":-1});
item.relationships={"friends":item.friends,"enemies":item.enemies};
item.username=item.name;
delete item.friends;
delete item.enemies;
delete item.name;
db.test.update({"_id":-1},item);

此時查詢的結果就會發生了變化:
在這裏插入圖片描述

來看看這麼一條語句:

db.users.update({ "name" : "joe" }, joe, true, true);

這裏面的後邊兩個參數涉及到了下邊兩個概念,分別是upsert模式和multi模式
UPSERT模式
如果有查詢到匹配的記錄則更新,反之則創建一條新的記錄。
MULTI模式
默認的時候update語句只會更新一個文檔數據,如果需要修改所有匹配的文檔,就需要開啓multi模式的參數了。

db.users.update({ "name" : "joe" }, joe, [UPSERT], [MULTI]  );
例如:
db.users.update({ "name" : "joe" }, joe, false, true );

如果更新的時候希望更新文檔對象的所有字段,推薦使用update語句,因爲update默認會更新整個文檔; 但是如果只需要做局部字段的更新,那麼我們使用修改器會更好。

修改器

最常用的$set修改器

db.test.update(
    {"author":"作者2"},
    {"$set":{"title":"更新後的標題2"}},false,true);

$inc修改器

db.test.update({"author":"作者2"},{"$inc":{"num":2}},false,true);

**for循環統一爲文檔添加屬性 **
如果以後需要統一對數據做格式修改的話,可以使用下邊這種方式:

var item=db.test.find({"title":"更新後的標題2"});
for(var i=0;i<item.size();i++){
   var newItem=item[i];
   newItem.num=i;
   db.test.update({"_id":item[i]._id},newItem,false,false);
}

查詢技巧

精確查詢

db.test.find({
    "title":"測試標題"
    })

distinct查詢

db.collection_name.distinct(field,query,options)
field -----指定要返回的字段(string)
query-----條件查詢(document)
options-----其他的選項(document)

or查詢
查詢title是xxx 或者 author是xxx的數據

db.getCollection('test').find({
    $or: [{"title":"MongodbTest2"},{"author":"作者"}]
    }).pretty();

打印查詢的一些內容

var item=db.test.find({});
for(var i=0;i<item.size();i++){
   console.log(item[i]);
}

大於$gt查詢

db.getCollection('test').find({
   title: {$gt :'sadasd'}
    }).pretty();
類比:
$gte,,$lte , $lt, $gt,$ne

查詢字段不爲空:

db.getCollection('test').find({'likes':{$ne:null} })

查詢字段爲空

db.getCollection('test').find({'likes':{$eq:null} })

多個條件查詢

db.getCollection('test').find({
   title: {$lt :'sadasd' ,$gt :'asdasd'}
    }).pretty();

如果想獲取 “col” 集合中 title 爲 String 的數據,你可以使用以下命令:

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

模糊查詢

獲取文檔裏面 tilte字段 以 “標題” 爲開始的數據

db.getCollection('test').find({
   "title": /^標題/
    }).pretty();

獲取文檔裏面 tilte字段包含 “標題” 的數據

db.getCollection('test').find({
   "title": /標題/
    }).pretty();

或者

db.getCollection('test').find({
   "title": /標題.*/
    }).pretty();

分頁情況查詢

db.getCollection('test').find({
   "title": /標題.*/
    }).limit(2).skip(4).pretty();

保證查詢兩條,而且跳過原先的前四條數據。可以參考這種方式來實現翻頁功能。

排序查詢
sort() 方法可以通過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而 -1 是用於降序排列。

db.getCollection('test').find({
    }). sort({   
       "title":1
       }).pretty();

管道統計
統計每個作者編寫的文章總數爲多少?
match相當於條件過濾
group是分組統計

db.test.aggregate(
    [
    {$match:{by_user :{$ne : null}}},
    {$group:{
        //注意這裏要寫爲_id才生效
        _id: "$by_user",articalTotal: {$sum:1}
        }}
    ]
)

查詢結果只顯示部分字段

db.BugPO.find(
    {'severity': {$ne : null}},
    {'severity':1}
)

Group完成器
看看mysql裏面的分組查詢,如下邊這條sql:

select title,author,sum(money) from [] 
where title!=null
group by title,author

如果切換到了mysql裏面又該怎麼編寫sql呢?

db.test.group({
    'key':{
       'title':true,
       'author':true
    },
    'cond':{
         "title":{$ne:null}
    },
    'reduce': function(obj,prev){
        prev.csum+=obj.money;
    },
    'initial':{
        'csum':0
    }}
)

刪除數據

筆者使用的mongodb是4.0.3版本:
刪除所有數據:(慎用)

db.test.remove({})

按條件刪除·
如果要按條件刪除·,那麼可以如下操作:

db.test.remove({
    "baz":"b"
});

額外補充

查看mongodb的版本號:

db.version();

目前筆者使用的是4.0.3版本。

判斷是否爲master節點

db.runCommand({
    "isMaster":1
})

查詢支持的命令語句有哪些

db.runCommand({
    "listCommands":1
})

查詢mongodb裏面的所有數據庫屬性

db.runCommand({
    "listDatabases":1
})

其實這條命令也驗證了,mongdb的數據庫中存儲的都是文檔類型。
可以理解爲,mongodb的文檔也就是對應mysql的表。

判斷服務器的鏈接是否正常

db.runCommand({
    "ping":1
})

當某天發現mongodb鏈接不上的時候(有可能是查詢緩慢出現了堵塞),可以用這個命令來判斷,這條命令是會繞開鎖的機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章