shell 俗稱叫做殼,計算機的殼層,和內核是相對的,用于和用戶交互,接收用戶指令,調用相應的程序。
因此,把shell分為2大類
1.1、圖形界面shell(Graphical User Interface shell 即 GUI shell)
也就是用戶使用GUI和計算機核交互的shell,比如Windows下使用最廣泛的Windows Explorer(Windows資源管理器),Linux下的X Window,以及各種更強大的CDE、GNOME、KDE、 XFCE。
他們都是GUI Shell。
1.2、命令行式shell(Command Line Interface shell ,即CLI shell)
也就是通過命令行和計算機交互的shell。 Windows NT 系統下有 cmd.exe(命令提示字符)和近年來微軟大力推廣的 Windows PowerShell。 Linux下有bash / sh / ksh / csh/zsh等 一般情況下,習慣把命令行shell(CLI shell)直接稱做shell,以后,如果沒有特別說明,shell就是指 CLI shell,后文也是主要講Linux下的 CLI shell。
根據交互方式的不一樣,命令行式shell(CLI shell),又分為交互式shell和非交互式shell。
2.1、交互式shell
交互式模式就是shell等待你的輸入,并且執行你提交的命令,然后馬上給你反饋。這種也是我們大多數時候使用的。
2.2、非交互式shell
非交互式shell,就是把shell放在寫在一個文件里面,執行的時候,不與用戶交互,從前往后依次執行,執行到文件結尾時,shell也就終止了。
在Linux下 ,各種shell百花齊放,種類繁多,不同的shell,也有不同的優缺點。 我們要查看當前系統下支持的shell,可以讀取/etc/shells文件。
3.1、bash
Bourne Again Shell 用來替代Bourne shell,也是目前大多數Linux系統默認的shell。
3.2、sh
Bourne Shell 是一個比較老的shell,目前已經被/bin/bash所取代,在很多linux系統上,sh已經是一個指向bash的鏈接了。 下面是CentOS release 6.5 的系統
3.3、csh/tcsh
C shell 使用的是“類C”語法,csh是具有C語言風格的一種shell,tcsh是增強版本的csh,目前csh已經很少使用了。
3.4、ksh
最早,bash交互體驗很好,csh作為非交互式使用很爽,ksh就吸取了2者的優點。
3.5、zsh
zsh網上說的目前使用的人很少,但是感覺使用的人比較多。 zsh本身是不兼容bash的,但是他可以使用仿真模式(emulation mode)來模擬bash等,基本可以實現兼容。 在交互式的使用中,目前很多人都是zsh,因為zsh擁有很強大的提示和插件功能,炫酷吊炸天。推薦在終端的交互式使用中使用zsh,再安利一個插件Oh My Zsh 其實我個人的理解是,在終端中使用shell,基本上只是調用各種命令,比如:curl cat ls等等,基本不會使用到zsh的編程,所以終端中使用zsh是可以的。但是在寫shell腳本的時候,需要考慮兼容性, 最主流的還是bash shell,所以,后文我們介紹的shell腳本也是bash shell的。
4.1、基礎
#!/bin/bash echo "Hello World !"
#!:是一個特殊的標記,表明使用啥解釋器來執行,比如這里使用了:/bin/bash 來執行這個腳本。 #:只用一個#,就是注釋 echo:輸出 我們把上面的腳本保存成一個文件, 1.sh 后面的這個sh是shell腳本的擴展名。 然后要怎嚒來執行呢?執行一個shell腳本有很多種方式:
這個是因為沒有這個腳本沒有執行權限,運行 chmod a+x 1.sh 加上執行權限即可。 這里順帶說一下,為啥直接運行1.sh不行呢?因為他默認是去PATH里面找程序,當前目錄,一般都不在PATH里面。所以直接運行1.sh就回報找不到文件。
根據測試,#!/bin/bash 的標記,只是針對第二種方式 ./xxx.sh的方式有效。本文中代碼,第一行均為這個標記,為了節約篇幅,已經省略.
執行并獲取返回結果,有點類似JavaScript 的eval函數。
#!/bin/bash dt=`date` #反引號內的字符串會當作shell執行 ,并且返回結果。 echo "dt=${dt}"
4.2、Shell 變量
shell的使用比較簡單,就像這樣,并且沒有數據類型的概念,所有的變量都可以當成字符串來處理:
#!/bin/bash myName="tom" youName="cat"
不需要申明,直接寫就可以了,但是有幾個點需要特別注意:
使用變量
ABC="tom" echo $ABC #使用變量前面加$美元符號 echo "ABC=$ABC" #可以直接在字符串里面引用 echo "ABC=${ABC}" #但是建議把變量名字用{}包起來
只讀變量
ABC="tom" echo "ABC=${ABC}" readOnly ABC #設置只讀 ABC="CAT" #會報錯,因為設置了只讀,不能修改
刪除變量
ABC="tom" echo "ABC=${ABC}" unset ABC #刪除 echo "ABC=$ABC" echo "ABC=${ABC}"
從這個例子當中,我們也發現,使用一個不存在的變量,shell不會報錯,只是當作空來處理。
4.3、Shell 的字符串
使用字符串
NAME="tom" A=my #你甚至可以不用引號,但是字符串當中不能有空格,這種方式也不推薦 B='my name is ${NAME}' #變量不會被解析 C="my name is ${NAME}" #變量會解析 echo $A echo $B echo $C
執行結果
我們可以發現,這個字符串的單雙號和PHP的處理非常類似,單引號不解析變量,雙引號可以解析變量。但是都可以處理轉義符號。
A='my\nname\nis\ntom' B="my\nname\nis\ntom" echo $A echo $B
執行結果
拼接字符串 其實shell拼接字符串,大概就是2種
NAME="TOM" # 使用雙引號拼接 echo "hello, "$NAME" !" #直接寫在一起,沒有字符串連接符 echo "hello, ${NAME} !" #填充模版 # 使用單引號拼接 echo 'hello, '$NAME' !' #直接寫在一起,沒有字符串連接符 echo 'hello, ${NAME} !' #上面已經提高過,單引號里面的變量是不會解析的
強大的字符串處理 shell中簡單的處理字符串,可以直接使用各種標記,只是比較難記憶,要用的時候,可以查一下。
ABC="my name is tom,his name is cat" echo "字符串長度=${#ABC}" # 取字符串長度 echo "截取=${ABC:11}" # 截取字符串, 從11開始到結束 echo "截取=${ABC:11:3}" # 截取字符串, 從11開始3個字符串 echo "默認值=${XXX-default}" #如果XXX不存在,默認值是default echo "默認值=${XXX-$ABC}" #如果XXX不存在,默認值是變量ABC echo "從開頭刪除最短匹配=${ABC#my}" # 從開頭刪除 my 匹配的最短字符串 echo "從開頭刪除最長匹配=${ABC##my*tom}" # 從開頭刪除 my 匹配的最長字符串 echo "從結尾刪除最短匹配=${ABC%cat}" # 從結尾刪除 cat 匹配的最短字符串 echo "從結尾刪除最長匹配=${ABC%%,*t}" # 從結尾刪除 ,*t 匹配的最長字符串 echo "替換第一個=${ABC/is/are}" #替換第一個is echo "替換所有=${ABC//is/are}" #替換所有的is
運行結構
這里只是介紹了比較常用的一些字符串處理,實際shell支持的還有很多。
4.4、數組
Bash Shell 也是支持數組的,與絕大部分語言一樣,數組下標從0開始。不過需要注意的是,它只支持一維數組。 定義一個數組,用小括號闊氣來,當中用“空格”分割,就像下面這樣:
array=("item0" "item1" "item2")
也可以根據下標來定義元素
array[0]="new_item0" array[1]="new_item1" array[2]="new_item2" array[4]="new_item4" #數組下標可以是不連續的
讀取數組元素,和變量類似
echo ${array[0]} echo "array[0]=${array[0]}"
獲取數組所有的元素
echo "數組的元素為: ${array[*]}" echo "數組的元素為: ${array[@]}"
獲取數組的長度
echo "數組的長度為: ${#array[*]}" echo "數組的長度為: ${#array[@]}"
4.5、輸入輸出
4.5.1、echo
在上文中,其實我們已經到多次,就是:echo “字符串” 來輸出,一個很簡單的例子
echo "Hello world!"
如果當中包含特殊符號,可以使用轉義等:
echo "Hello \nworld!" echo "\"Hello\"" echo '"Hello"' #當然,也可以這樣,單引號不轉義,上文提到過 echo `date` #打印執行date的結果 echo -n "123" #加-n 表示不在末尾輸出換行 echo "456" echo -e "\a處理特殊符號" #-e 處理特殊符號
-n 讓echo輸出結束以后,在默認不輸出換行符 -e 讓echo處理特殊符號,比如:
符號作用 \a發出警告聲 \b刪除前一個字符 \c后不加上換行符號 \f換行但光標仍舊停留在原來的位置 \n換行且光標移至行首 \r光標移至行首,但不換行 \t插入tab 上面的特殊符號,寫到mac的shell腳本里面要注意,執行的時候,要用bash執行才有效 ,sh無效。
當然,你也可以玩一點更有趣的,就是我們隨時在終端中看到的五顏六色的文字:
echo -e "\033[31m 紅色前景 \033[0m 缺省顏色" echo -e "\033[41m 紅色背景 \033[0m 缺省顏色"
其中 3[是一個特殊標記,表示終端轉義開始, 31m表示使用紅色字體,你也可以使用其他顏色,[30-39]是前景顏色,[40-49]是背景顏色。 3[0m回復到缺省設置 還可以有一些其他的動作
echo -e "\033[2J" #清除屏幕 echo -e "\033[0q" #關閉所有的鍵盤指示燈 echo -e "\033[1q" #設置"滾動鎖定"指示燈(Scroll Lock) echo -e "\033[2q" #設置"數值鎖定"指示燈(Num Lock) echo -e "\033[1m" #設置高亮度 echo -e "\033[4m" #下劃線 echo -e "\033[7m" #反顯 echo -e "\033[y;xH" #設置光標位置
其他更多的特殊碼請自行查詢。
4.5.2、read
有輸出,必然有輸入,read命令接收標準輸入的輸入。
read name echo "my name is ${name}"
可以使用-p給一個輸入提示
read -p "please input your name:" name echo "my name is ${name}"
如果沒有指定輸入的變量,會把輸入放在環境標量REPLY中
read -p "please input your name:" echo "my name is ${REPLY}"
計時輸入,如果一段時間沒有輸入 ,就直接返回,使用-t 加時間
read -t 3 -p "please input your name in 3 senconds:" name
指定輸入字符個數,使用-n ,后面的是輸入字符個數
read -n 1 -p "Are you sure [Y/N]?" isYes
默讀(輸入不再監視器上顯示),加一個-s參數。
read -s -p "Enter your password:" password
4.5.3、printf
echo已經比較強大,但是有的時候,我們需要用到字符串模版輸出,printf就比較好用了,他類似C里面的printf程序。 語法是:printf format-string [arguments...] 比如我們要輸出一個表格
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
運行結果
%s %c %d %f都是格式替代符 %-10s 指一個寬度為10個字符(-表示左對齊,沒有則表示右對齊),至少顯示10字符寬度,如果不足則自動以空格填充,超過不限制。 %-4.2f 指格式化為小數,其中.2指保留2位小數。
4.5.4、重定向
大多數 UNIX 系統命令從你的終端接受輸入并將所產生的輸出發送回到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入,默認情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標準輸出,默認情況下,這也是你的終端。
命令作用 command > file將輸出重定向到 file。 command < file將輸入重定向到 file。 command >> file將輸出以追加的方式重定向到 file。 n > file將文件描述符為 n 的文件重定向到 file。 n >> file將文件描述符為 n 的文件以追加的方式重定向到 file。 n >& m將輸出文件 m 和 n 合并。 n <& m將輸入文件 m 和 n 合并。 << tag將開始標記 tag 和結束標記 tag 之間的內容作為輸入。 需要注意的是文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
輸出到文件
echo "test">text.txt #直接輸出 echo "test">>text.txt #追加在text.txt后面
重定向輸入
read a <<EOF "測試" EOF echo "a=$a"
來個比較過分的
cat < 1.sh > text.txt
把1.sh文件的內容出入到cat,然后cat在輸出到text.txt中,相當于,把1.sh的內容輸出到text.txt中了
還有一種用法,把標準錯誤直接輸出到標準輸出,并且輸出到文件file
command > file 2>&1
/dev/null 文件 這個是一個特殊文件,他是一個黑洞,寫入到它的內容都會被丟棄,如果我們不關心程序的輸出,可以這樣
command > /dev/null 2>&1
4.6、條件判斷(if)
和其他語言一樣,shell也有條件判斷
單分支:
if condition then command1 command2 ... fi
雙分支:
if condition then command1 command2 ... else command fi
多分支:
if condition1 then command1 elif condition2 then command2 else commandN fi
比如
if [ "2"=="2" ]; then # "2" 的2邊都有空格,不能省略 ,寫在一行,條件后面加一個分號 echo "2==2" else echo "2!=2" fi
需要特別注意:[ "2"=="2" ] 其中的"=="兩邊都有空格,不能省略,否則結果不正確。 判斷普通文件是否存在
if [ -f "1.sh" ]; then # 判斷一個普通文件是否存在 echo "1.sh 存在" fi
判斷目錄是否存在
if [ -d "1.sh" ]; then # 判斷一個目錄是否存在 echo "1.sh 存在" fi
判斷字符串長度為0
a="" if [ -z $a ]; then echo "a為空" fi
4.7、()、(())、[]、[[]]和{}
在shell中,有幾個符號要非常注意,用的也比較多,不要搞混了,搞混了,邏輯運算很容易出錯
4.7.1、單小括號()
a="123" (echo "123";a="456";echo "a=$a") echo "a=$a
4.7.2、雙小括號(())
a=$((4+5)) echo "a=$a"
a=5 ((a++)) echo "a=$a"
if ((1+1>1));then echo "1+1>1" fi
4.7.3、單中括號[]
if [ "2"=="2" ]; then # "2" 的2邊都有空格,不能省略 echo "2==2" else echo "2!=2" fi
if [ 2 -eq 2 ]; then echo "2==2" else echo "2!=2" fi
if [ "2"=="2" -a "1"=="1" ]; then #注意,在這里,不能是[ "2"=="2" ] -a [ "1"=="1" ] 會報錯 echo "ok" fi
4.7.4、雙中括號[[]]
[[是 bash 程序語言的關鍵字。并不是一個命令,[[ ]] 結構比[ ]結構更加通用。
if [[ "123"==12* ]]; then #右邊是正則不需要引號 echo "ok" fi
if [[ 2.1 > 1.1 ]]; then echo "ok" fi
if [[ 1.1 > 1.1 ]] || [[ 1.1==1.1 ]]; then echo "ok" fi
4.7.5、大括號{}
touch file_{1..5}.txt #創建new_1.txt new_2.txt new_3.txt new_4.txt new_5.txt 5個文件
4.8、循環
4.8.1、for循環
語法格式為:
for a in "item1" "item2" "item3" do echo $a done
輸出當前目錄下 .sh結尾的文件
for a in `ls ./` do if [[ $a==*.sh ]] then echo $a fi done
4.8.2、for循環
語法
while condition do command done
我們要輸出1-10000
int=1; while(($int<=10000)) do echo $int ((int++)) done
4.8.3、until循環
語法
until condition do command done
用法類似,這里不再贅述。 循環中 continue命令與break作用和其他語言中類似。
4.9、case
case和其他語言switch類型,多分支,選擇一個匹配。匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;,有點類型Java的break。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。
echo '輸入 1 到 4 之間的數字:' echo '你輸入的數字為:' read aNum case $aNum in 1) echo '你選擇了 1' ;; 2) echo '你選擇了 2' ;; 3) echo '你選擇了 3' ;; 4) echo '你選擇了 4' ;; *) echo '你沒有輸入 1 到 4 之間的數字' ;; esac
4.10、函數
shell也可以用戶定義函數,然后在shell腳本中可以隨便調用。 注意:所有函數在使用前必須定義。這意味著必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。調用函數僅使用其函數名即可。 語法格式如下:
[function] funname() { cmd.... [return int] }
一個最簡單的函數
Line(){ echo "--------分割線--------" } echo "123" Line echo "456"
在Shell中,調用函數時可以向其傳遞參數。 在函數體內部,通過 $n 的形式來獲取參數的值,例如,表示第一個參數,表示第二個參數... 調用的時候 ,函數名,參數直接用空格分割開。 帶參數的函數示例:
out(){ echo "1-->$1" echo "2-->$2" } out 1 2 #調用的之后
還有一些其他的特殊符號需要注意
符號作用 $#傳遞到腳本的參數個數 $*以一個單字符串顯示所有向腳本傳遞的參數 $$腳本運行的當前進程ID號 $!后臺運行的最后一個進程的ID號 $@與$*相同,但是使用時加引號,并在引號中返回每個參數。 $?顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 所以我們可以寫一個代碼參數,返回值的函數
out(){ echo "全部參數$*" for item in $* do echo "$item" done return $# #這類返回參數個數,返回值必須是整數 } out this is perfect echo "函數返回值:$?"
4.11、shell傳遞參數
我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。n 代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推…… 除了參數可以使用特殊符號,也可以使用上文中函數所使用的特殊符號,這里不再贅述
echo "執行的文件名:$0"; echo "全部參數:$*" echo "參數個數:$#" echo "第一個參數為:$1"; echo "第二個參數為:$2"; echo "第三個參數為:$3";
shell腳本,他本身的功能并不強大,強大的是他可以調用其他程序,而在Linux下,系統自帶的就有非常多的強大工具可以調用。
5.1、后臺執行
后臺執行一個腳本只需要在后面加上&符號即可,我們先用之前學習的,寫一個腳本,1s輸出一個數字
#!/bin/bash int=1 while : do echo $int ((int++)) sleep 1s #睡眠一秒 done
我們執行sh d.sh & 我們發現,的確會后臺輸出,但是會輸出到當前控制臺,我們可以用之前學的重定向,把輸出重定向到文件
sh d.sh > out.log 2>&1 &
這樣就把輸出和錯誤重新定向到out.log文件了 但是,我們發現,關閉終端以后,文件就不輸出了。 當我們端口連接遠程主機的session或者關閉當前終端的時候, 會產生一個SIGHUP信號 ,導致程序退出,我們可以使用nuhup來忽略這個信號 ,達到真正的后臺。
nuhup sh d.sh > out.log 2>&1 &
這樣啟動程序,就可以打到真正后臺運行了。 那么問題來了,我們驗證程序在后臺運行呢?要怎嚒結束后臺程序呢?請繼續看。
5.2、cat
在本文中,我們已經多次用到cat,他的作用就是讀取文件輸出到標準輸出上,也就是我們的終端。 語法是:
cat [option] file
我們也可以使用:cat -n file ,來輸出行號。
5.2、tail
類似上面的例子,我們要驗證程序是不是在后臺,每一秒輸出一個數字到文件,使用cat讀取,需要不斷的多次查看,一次cat只能輸出一次。 tail非常適合查看這種日志類文件,他的作用是讀取文件末尾幾行輸出到標準輸出上。 tail out.log 默認顯示10行,可以使用參數-n指定行數 tail -20 out.log 顯示文件末尾20行 tail -f out.log 持續監控文件out.log,如果有變化,他會試試的顯示在我們的屏幕上面。
5.3、ps
ps,查詢進程 這個命令參數比較多,列舉幾個比較常用的
參數作用 a顯示終端上的所有進程,包括其他用戶的進程。 u顯示面向用戶的格式信息。 x顯示沒有控制終端的進程。 一般查詢,使用 ps aux就可以了,查詢出來比較多,可以篩選一下。 這里我們使用 ps u 就可以查詢出我們剛才開啟的后臺進程了。
我們看到我們剛才啟動的程序PID為7523, 使用kill命令就可以殺死他了
5.4、kill
kill命令比較簡單,就是根據PID結束一個程序,比如我們已經查詢到,我們開的后臺進行是7523,要結束他可以使用: kill 7523 以上是常用用法,其實kill是給程序發送一個信號,上面的程序給會程序發送一個SIGTERM信號,程序收到這個信號,完成資源的釋放,就退出了。 但是也有程序不聽話,收到信號就是不退出,這個時候,就要強制他退出,使用9號命令(SIGKILL),強制殺死他。 簡單的說 kill PID 是告訴程序,你應該退出了,請自己退出。 kill -9 PID ,是直接告訴程序,你被終結了,這個命令信號,不能被抓取或者忽略。
文章來源:http://blog.zjiecode.com/2019/04/15/shell/
寫前面的博文的時候,我發現MongoDB shell提供了很多方法,其中MongoDB的很多方法也在其中,下面是我從MongoDB官網上查到的所有MongoDB shell的所有方法,當然,我不會對每個方法進行詳細解釋,因為太多了。我會將方法功能說明白,并且把官網連接掛在后面,有興趣的可以點進去看一下。由于個人翻譯水平有限,可能有些翻譯文不及意,忘海涵!
對于查看方法有一個小技巧,就是我們使用shell或在linux系統里面想要查看某個對象能夠調用的所有方法時可以使用:對象.+tab+tab,如圖db對象能夠調用的所有方法和集合(后面帶半括號的都是方法,不帶半括號的都是對象):
下面開始:
集合方法(Collection Methods)
注:db.collection.*==db.要操作的集合名稱.*
方法名方法功能官網連接db.collection.aggregate(pipeline, options)計算集合或視圖中的數據的聚合值。鏈接db.collection.bulkWrite()3.2版本,控制多個操作順序執行寫入操作鏈接db.collection.copyTo(newCollection)3.0版本以后不建議使用,使用服務器端的javascript將當前集合中的所有文檔復制到newCollection中。如果newCollection不存在,mongodb會自動創建。鏈接db.collection.count(query, options)根據查詢條件和限制條件,獲取符合條件的文檔數鏈接db.collection.createIndex(keys, options)在集合中創建索引,3.2版本修改:mongodb不允許創建0版本索引。若要升級現有的0版本索引,請參考 Version 0 Indexes鏈接db.collection.createIndexes([keyPatterns, ]options)3.2版本新功能,在集合上創建一個或多個索引鏈接db.collection.dataSize()返回當前集合的數據量大小,此方法提供了一個包裹collStats(即db.collection.stats()命令的大小輸出的包裝器鏈接db.collection.deleteOne(filter,[writeConcern],[collation])從集合中刪除單個文檔鏈接db.collection.deleteMany(filter,[writeConcern],[collation])刪除所有與篩選器匹配的文檔鏈接db.collection.distinct(field, query, [options])在單個集合或視圖中找到指定字段的不同值列表,并返回數組中的結果。鏈接db.collection.drop()從數據庫中刪除一個集合或視圖,該方法還會刪除與已刪除集合關聯的任何索引。該方法提供了包裹drop命令的包裝器鏈接db.collection.dropIndex(index)從集合中刪除指定索引,該方法提供了包裹dropIndexes命令的包裝器鏈接db.collection.dropIndexes()刪除除_id字段上的必需索引以外的所有索引。只調用dropIndexes()作為集合對象上的方法。警告:此命令在受影響數據庫中獲得寫入鎖,并將阻止其他操作直到完成為止。鏈接db.collection.ensureIndex(keys, options)如果索引未存在,則在指定字段上創建索引。3.0.0版本以后不建議使用:該方法更名為createIndex()。鏈接db.collection.explain()3.0版本新功能,3.0版本添加 db.collection.distinct()支持。返回下列操作的查詢計劃的信息: aggregate(); count(); distinct(); find(); group(); remove(); 和 update()方法。鏈接db.collection.find(query, projection)在集合或視圖中查詢符合條件的文檔,并返回選定文檔的游標。鏈接db.collection.findAndModify(document)修改并返回單個文檔。默認情況下,返回的文檔不包含更新上所做的修改。若要使用更新上的修改返回文檔,請使用新參數。鏈接db.collection.findOne(query, projection)返回滿足集合或視圖上指定的查詢條件的文檔列表的磁盤上文檔順序的自然順序的第一個文檔。在覆蓋集合中,自然順序與插入順序相同。如果沒有文檔滿足查詢,則該方法返回null。鏈接db.collection.findOneAndDelete(filter, options)3.2版本新功能,根據篩選條件刪除第一個惡文檔,并返回已刪除的文檔。鏈接db.collection.findOneAndReplace(filter, replacement, options)3.2版本新功能,根據篩選條件替換第一個文檔鏈接db.collection.findOneAndUpdate(filter, update, options)3.2版本新功能,根據篩選器條件更新第一個文檔。鏈接db.collection.getIndexes()返回當前集合中現有索引的文檔列表數組。您必須在集合上調用該方法。鏈接db.collection.getShardDistribution()打印一個sharded集合的分布統計數據,您必須在sharded集合上調用該方法鏈接db.collection.getShardVersion()當我們診斷sharded集群基礎問題時,返回關于sharded集群的有用的狀態信息。僅用于內部診斷鏈接db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })將集合中的文檔按指定鍵進行組,并執行簡單聚合函數,該方法類似于sql中語句的SELECT <…> GROUP BY語句,3.4版本不建議使用:3.4版本重新定義了該方法. 使用aggregate()的$group或者mapReduce()方法代替鏈接db.collection.insert()在集合中插入一個文檔或多個文檔鏈接db.collection.insertOne()3.2版本新功能,在集合中插入一個文檔鏈接db.collection.insertMany()3.2版本新功能,在集合中插入多個文檔鏈接db.collection.isCapped()判斷當前集合是否是一個capped collection鏈接db.collection.latencyStats(options)返回給定集合的延遲統計值,它是一個$collStats的包裝器鏈接db.collection.mapReduce(map, reduce, {out, query, sort, limit, finalize, scope, jsMode, verbose})該方法提供了一個 mapReduce命令的包裝器鏈接db.collection.reIndex()該將集合中的所有索引都刪除并重新創建它們。對于擁有大量數據和或大量索引的集合來說,此操作可能會很浪費資源。鏈接db.collection.remove()刪除集合中打的所有文檔,該方法可以攜帶兩個參數,查詢條件和一個justOne 的boolean值鏈接db.collection.renameCollection(target, dropTarget)給集合重命名,該方法提供了一個 renameCollection database命令的包裝器鏈接db.collection.replaceOne(filter, replacement, options)3.2新功能,根據篩選器替換集合內的單個文檔。鏈接db.collection.save()根據文檔參數,更新現有文檔或插入新文檔鏈接db.collection.stats(scale \ options)返回有關集合的統計信息。鏈接db.collection.storageSize()分配給此集合用于文檔存儲的總存儲量。提供了一個封裝collStats輸出的storageSize字段的包裝器鏈接db.collection.totalIndexSize()集合中所有索引的總數,該方法封裝了一個collStats(即db.collection.stats())操作的輸出totalIndexSize的封裝器鏈接db.collection.totalSize()集合中數據的字節總數加上集合中的每個索引的大小。鏈接db.collection.update(query, update, options)修改集合中的一個文檔或多個文檔。該方法可以修改文檔的特定字段,或者完全替換現有文檔,取決于更新參數。默認情況下,update()方法更新單個文檔。設置多參數( Multi Parameter)以更新所有符合查詢標準的文檔。鏈接db.collection.updateOne(filter, update, options)3.2版本新功能根據篩選器更新集合中的單個文檔。鏈接db.collection.updateMany(filter, update, options)3.2新版本功能,根據篩選器更新集合中的多個文檔。鏈接db.collection.watch(pipeline, options)在集合上打開一個更改流游標(change stream cursor)。鏈接db.collection.validate(true)驗證集合。該方法掃描集合的數據結構的正確性并返回一個文檔,該文檔描述邏輯集合與數據本身描述之間的關系。鏈接
游標方法(Cursor Methods)
注:游標即為調用下列方法的對象
方法名方法功能官網連接cursor.addOption(flag)添加OP_QUERY有線協議標志,比如tailable flag,來更改查詢的行為。但是3.2版本以后,不建議在MongoDB shell中使用,可以使用有用的游標方法代替鏈接cursor.batchSize(size)從mongodb實例中獲取每個批處理響應中返回的文檔數。在大多數情況下,修改批處理大小不會影響用戶或應用程序,因為在shell和大多數驅動程序中返回結果就好像mongodb返回單個批處理一樣。鏈接cursor.close()指示服務器關閉游標并釋放相關服務器資源。服務器會自動關閉沒有剩余結果的游標,以及那些已經閑置了一段時間且沒有被cursor.noCursorTimeout()方法選中的游標。鏈接cursor.isClosed()返回服務器是否關閉了該游標,一個關閉的游標仍可能保留最后的批處理中的文檔。使用cursor.isExhausted()或cursor.hasNext()來檢查游標是否已完全處理完成。鏈接cursor.collation(collation document)3.4版本新功能,使用db.collection.find()來校驗游標返回說明鏈接cursor.comment()3.2版本新功能,向查詢添加注釋字段鏈接cursor.count()返回游標引用的文檔數。將count()方法追加到find()查詢以返回匹配文檔的數量。該操作不會執行查詢,而是查詢可能返回的結果數量。2.6版本以后,mongodb支持hint()使用count()。鏈接cursor.explain(verbosity)提供 db.collection.find()方法的查詢計劃的相關信息。該方法的參數和輸出格式在3.0中發生了變化。鏈接cursor.forEach(function)迭代游標,使標中的每個文檔執行javascript函數。鏈接cursor.hasNext()返回當前游標是否還有剩余的文檔鏈接cursor.hint(index)在一個查詢上調用本方法來重寫MongoDB的默認搜索索引和查詢優化過程,使用 db.collection.getIndexes()方法返回集合中當前索引的列表。鏈接cursor.isExhausted()判斷光標關閉,批處理中是否還有剩余對象。可以使用isExhausted()支持迭代游標,即使當前批中沒有文檔,比如tailable或更改流游標(change stream cursors),仍然保持打開鏈接cursor.itcount()返回游標中剩余的文檔數。該方法與cursor.count()方法相近,但是其實際上執行了對現有迭代器的查詢,會在進程中耗盡它的內容。鏈接cursor.limit()在一個游標上使用該方法,限制游標將返回的的最大文檔數,該方發與sql數據庫中的LIMIT語句功能類似。鏈接cursor.map(function)將函數應用于游標中的每個文檔,并持續將從應用程序中的返回值收集到數組中鏈接cursor.max()指定特定索引的專有的上限,以約束find().max()的返回結果,提供了指定復合索引的上限的方法。鏈接cursor.maxScan()3.2版本新功能,指定查詢計劃將掃描的最大文檔或索引鍵數。一旦達到了極限會終止執行查詢并返回當前批處理的結果。鏈接cursor.maxTimeMS(time limit)2.6版本新功能,指定用于處理游標操作的總毫秒時間限制。鏈接cursor.min()指定特定索引的專有的下限,以約束find().max()的返回結果,提供了指定復合索引的下限的方法。鏈接cursor.next()通過db.collection.find()來返回游標中的下一個文檔。參考cursor.hasNext()相關功能。鏈接cursor.noCursorTimeout()指示服務器避免在一個不活動期間自動關閉游標。鏈接cursor.objsLeftInBatch()返回當前批處理中剩余的文檔數。mongodb實例在批返回響應時,若要從一個游標中檢索所有文檔,可能需要mongodb實例的多個批處理響應。當當前批處理中沒有其他文檔時,游標將檢索另一個批處理,以便在當前游標耗盡之前獲取更多文檔鏈接cursor.pretty()配置游標以易于讀的格式顯示結果。鏈接cursor.readConcern(level)3.2版本新功能,指定當前游標的db.collection.find()方法的寫關注等級鏈接cursor.readPref(mode, tagSet)將readPref()方法追加到游標上,來控制客戶端怎樣的方式查詢副本集的成員鏈接cursor.returnKey()3.2版本新功能,修改游標以返回索引鍵而不是文檔。鏈接cursor.showRecordId()3.2版本該方法替換前面的cursor.showDiskLoc()方法,通過向匹配文檔添加字段recordId來修改查詢的輸出。recordId是唯一標識集合中文檔的內部鍵。鏈接cursor.size()返回經過任意cursor.skip()或cursor.limit()方法限制之后的符合db.collection.find()方法的查詢條件的文檔數鏈接cursor.skip(offset)在一個游標上調用該方法來控制mongodb返回結果的開始位置。這種方法可能有助于實現分頁的結果。鏈接cursor.sort(sort)指定查詢返回匹配文檔的順序。在檢索數據庫中的任何文檔之前,必須將sort()應用到游標中。鏈接cursor.tailable()3.2版本新功能,將游標標記為“tailable”。只用于對覆蓋集合進行使用。使用tailable對非限定集合進行處理將報錯。鏈接cursor.toArray()該方法返回一個包含游標中所有文檔的數組。該方法將完全迭代游標,將所有文檔加載到ram中并耗盡游標。鏈接
數據庫方法(Database Methods)
方法名方法功能官網連接db.adminCommand(command)提供一個助手來運行指定數據庫命令,以執行管理數據庫。鏈接db.aggregate()3.6版本新功能,運行一個指定的不需要底層集合的admin/diagnostic渠道,用于收集數據的聚合信息,請參考db.collection.aggregate()。鏈接db.cloneCollection(from, collection, query)復制MongoDB實例之間的數據,該方法封裝了cloneCollection指令鏈接db.cloneDatabase(“hostname”)將遠程數據庫數據復制到當前數據庫。該命令假定遠程數據庫與當前數據庫具有相同的名稱。鏈接db.commandHelp(command)顯示指定數據庫命令的幫助文本。鏈接db.copyDatabase(fromdb, todb, fromhost, username, password, mechanism)將數據庫從一個mongod實例復制到當前的mongod實例或在mongod. db.copyDatabase()封裝copydb指令的包裝器的范圍內。3.0以后,當對在實例進行身份驗證時,db.copyDatabase()支持SCRAM-SHA-1和 MONGODB-CR機制來驗證在用戶。鏈接db.createCollection(name, options)創建一個集合或視圖,3.4版本增加創建視圖集合、校驗功能。由于mongodb在命令中在首次引用集合時會隱式創建集合,所以該方法主要用于創建使用特定選項的新集合。鏈接db.createView()3.4版本新功能,從源集合或視圖上創建一個應用具體的aggregation pipeline的結果視圖。視圖充當只讀集合,并在讀取操作期間根據需求計算。mongodb將視圖中的讀取操作作為一部分隱含的aggregation pipeline。鏈接db.currentOp()返回一個包含數據庫實例的進程操作信息的文檔。該方法封裝了數據庫指令currentOp鏈接db.dropDatabase()刪除當前數據庫,刪除關聯的數據文件。鏈接db.eval(function, arguments)提供在mongodb服務器上運行javascript代碼的能力。3.0版本以后不建議使用鏈接db.fsyncLock()強制在將所有掛起的寫入操作刷新到磁盤,并鎖定整個mongod實例以防止額外的寫入,直到用戶釋放帶有相應的db.fsyncUnlock()命令的鎖為止。鏈接db.fsyncUnlock()將一個mongod實例上通過 db.fsyncLock()方法上的鎖減1鏈接db.getCollection(name)返回一個集合或視圖對象,該集合或視圖對象函數等效于使用 db.collectionName語法。該方法對于集合或視圖有用,該集合或視圖名可能與mongo shell本身交互,例如以_開頭的名稱或匹配數據庫shell方法的名稱。鏈接db.getCollectionInfos(filter)3.0版本新功能,返回一個包含當前數據庫的集合或視圖信息的文檔數組,如名稱和選項鏈接db.getCollectionNames()返回包含當前數據庫中所有集合和視圖的名稱的數組。鏈接db.getLastError(w, wtimeout)指定寫入關注級別,以確認在同一連接上執行的先前的寫入操作的成功,并返回該操作的錯誤字符串。當使用該方法時,當前操作必須與他們希望確認的寫入操作在相同的連接上。鏈接db.getLastErrorObj()指定寫入關注級別,以確認在同一連接上執行的先前的寫入操作的成功,并返回該操作的文檔。當使用該方法時,當前操作必須與他們希望確認的寫入操作在相同的連接上。鏈接db.getLogComponents()3.0版本新功能,返回當前詳細設置。詳細設置了mongodb為每個日志消息組件生成的日志信息的數量。鏈接db.getMongo()該方法在shell啟動時運行。使用此命令測試mongo shell是否具有正確的數據庫實例的連接。鏈接db.getName()當前數據庫名稱。鏈接db.getPrevError()一個包含錯誤的狀態文檔。1.6版本之后不建議使用鏈接db.getProfilingLevel()該方法提供了一個封裝了數據庫命令profile的包裝器,返回當前的概要文件級別。1.8.4版本以后不建議使用, 使用db.getProfilingStatus()相關功能鏈接db.getProfilingStatus()當前配置文件級別、slowOpThresholdMs設置和slowOpSampleRate設置。鏈接db.getReplicationInfo()使用oplog投票的數據,返回具有副本集的狀態的文檔。在診斷復制問題時使用此輸出。鏈接db.getSiblingDB(database)用于無需修改shell環境中的db變量而能返回另一個數據庫。鏈接db.help()列出了db對象上的常用方法的文本。鏈接db.hostInfo()返回一個文檔,該文檔包含 mongod或mongos運行的底層系統的信息。一些返回字段僅包含在一些平臺上。鏈接db.isMaster()返回mongod實例的角色的描述文檔。如果該mongod是副本集的成員,則ismaster和 secondary字段實例是否為主集報告,或者它是復制集的輔助成員。鏈接db.killOp(opid)終止操作id指定的操作。查找操作及其相應的id,可以參考db.currentOp()鏈接db.listCommands()提供所有數據庫命令的列表。鏈接db.loadServerScripts()該方法將當前數據庫的在system.js集合中的所有腳本加載到mongo shell會話中。鏈接db.logout()結束當前身份驗證會話。如果當前會話未被驗證,則此函數沒有效果。鏈接db.printCollectionStats()提供了一個封裝 db.collection.stats() 方法的包裝器,從每個集合中返回統計數據,由三個連字符符號分隔。鏈接db.printReplicationInfo()打印副本集成員的oplog的格式化報表。所顯示的報表由db.getReplicationInfo()返回的數據格式化而成。鏈接db.printShardingStatus()打印分片配置的格式化報告以及關于一個分片集群中現有塊的信息鏈接db.printSlaveReplicationInfo()從集合的從成員的角度返回副本集一個副本集的狀態的格式化報告,其輸出與rs.printSlaveReplicationInfo()方法一致。鏈接db.repairDatabase()該方法提供了封裝數據庫命令repairDatabase的封裝器,與運行選項 mongod –repair選項一樣,僅限于當前數據庫。鏈接db.resetError()1.6版本以后不建議使用,重置由db.getPrevError或getPrevError返回的錯誤消息。提供了封裝resetError命令的包裝器。鏈接db.runCommand(command)提供了一個運行指定數據庫指令的助手,這是執行數據庫命令的首選方法,因為它提供了shell和驅動程序之間的一致接口。鏈接db.serverBuildInfo()提供了一個封裝 buildInfo數據庫命令的包裝器, buildInfo返回一個文檔,該文檔包含用于編譯此mongod實例的參數概述。鏈接db.serverCmdLineOpts()包裝getCmdLineOpts數據庫指令,返回用于對用于啟動mongod或mongos實例的參數和配置選項進行報告的文檔。鏈接db.serverStatus()返回提供數據庫進程狀態的概述文檔。3.0版本修改:該方法不再輸出workingSet、indexCounters和recordStats部分。鏈接db.setLogLevel()3.0版本新功能,設置日志消息的單個詳細級別。鏈接db.setProfilingLevel(level, options)配置database profiler。該方法提供了一個封裝profile指令的包裝器鏈接db.shutdownServer()干凈和安全的關閉當前的mongod或mongos進程。該方法必須在admin數據庫中執行,該指令提供了一個封裝shutdown指令的包裝器鏈接db.stats(scale)返回反映單個數據庫使用狀態的統計信息。鏈接db.version()返回mongod或mongos實例的版本信息鏈接
查詢計劃緩存方法(Query Plan Cache Methods)
方法名方法功能官網連接db.collection.getPlanCache()返回一個接口來訪問集合的查詢計劃緩存。該接口提供查看和清除查詢計劃緩存的方法。查詢優化器只緩存那些可以具有多個可行計劃的查詢結構的計劃。鏈接PlanCache.clear()刪除集合中所有緩存查詢計劃鏈接PlanCache.clearPlansByQuery(query, projection, sort)清除指定查詢結構的緩存查詢計劃。鏈接PlanCache.getPlansByQuery(query, projection, sort)顯示指定查詢結構的緩存查詢計劃。查詢優化器只緩存那些可以具有多個可行計劃的查詢結構的計劃。鏈接PlanCache.help()顯示查看和修改集合的查詢計劃緩存的可用方法。鏈接PlanCache.listQueryShapes()顯示存活的緩存查詢計劃的查詢結構。查詢優化器只緩存那些可以具有多個可行計劃的查詢結構的計劃。鏈接
批量操作方法(Bulk Operation Methods)
方法名方法功能官網連接db.collection.initializeOrderedBulkOp()初始化并返回一個用于集合的新的批量操作生成器。生成器構造了mongodb執行批量執行的一個有序的寫入操作列表。從3.2版本開始,mongodb還提供了用于執行批量寫入操作的在db.collection.bulkWrite() 方法。鏈接db.collection.initializeUnorderedBulkOp()2.6版本新功能,初始化并返回一個用于集合的新的批量操作生成器。生成器構造了mongodb在批量執行的無序寫入操作列表。鏈接Bulk()2.6版本新功能,批量操作生成器用于在單個集合上的批量操作構造寫入操作列表。想要實例化生成器,可以使用 db.collection.initializeOrderedBulkOp()或 db.collection.initializeUnorderedBulkOp()方法。鏈接Bulk.execute()2.6版本新功能,通過批量操作生成器執行批量操作鏈接Bulk.find(query)2.6版本新功能,指定用于更新或刪除操作的查詢條件。鏈接Bulk.find.arrayFilters(array of filter documents)3.6版本新功能,指定用于確定用于更新或更新一個數組的元素的過濾器。鏈接Bulk.find.collation(document)3.4版本新功能,指定批量寫入的校驗規則。追加到Bulk.find()方法來指定查找操作的校驗規則。鏈接Bulk.find.remove()2.6版本新功能,在批量操作中添加一個移除操作,使用Bulk.find()方法指定能確定哪些文檔要移除的條件。該方法刪除集合中的所有匹配文檔。如果移除單個文檔,可以參考Bulk.find.removeOne()鏈接Bulk.find.removeOne()2.6版本新功能,在批量操作中添加一個單文檔刪除操作。使用Bulk.find()方法指定能確定哪些文檔要移除的條件。該方法限制刪除單個文檔。鏈接Bulk.find.replaceOne(document)2.6版本新功能,在批量操作中添加一個單文檔替換操作。使用Bulk.find()方法指定能確定哪些文檔要替換的條件。該方法限制替換單個文檔。鏈接Bulk.find.updateOne(update)2.6版本新功能,在批量操作中添加一個單文檔修改操作。使用Bulk.find()方法指定能確定哪些文檔要修改的條件。該方法限制修改單個文檔。如果想要批量更改文檔,請參考Bulk.find.update()鏈接Bulk.find.update(update)2.6版本新功能,在批量操作中添加一個批量修改操作。該方法更新現有文檔中的特定字段。使用Bulk.find()方法指定能確定哪些文檔要修改的條件。該方法修改所有的匹配文檔。鏈接Bulk.find.upsert()2.6版本新功能,需要在一個修改或替換操作將upsert選項設為true。如果將upsert選項設置為true,如果不存在匹配文檔,則執行插入操作。如果確實存在匹配文檔,則執行指定的更新或替換。鏈接Bulk.getOperations()2.6版本新功能,返回通過Bulk.execute()方法執行的寫入操作數組。返回的寫入操作是由mongodb確定的用于執行的群組。鏈接Bulk.insert(document)2.6版本新功能,將插入操作添加到批量操作列表中。鏈接Bulk.tojson()2.6版本新功能,返回一個包含了批量方法對象中操作數和批處理數的json文檔。鏈接Bulk.toString()2.6版本新功能,將包含了批量方法對象中操作數和批處理數的json文檔作為字符串返回鏈接
用戶管理方法(User Management Methods)
方法名方法功能官網連接db.auth()允許用戶在shell中對數據庫進行身份驗證。鏈接db.changeUserPassword(username, password)修改用戶的密碼鏈接db.createUser(user, writeConcern)為運行該方法的數據庫創建一個新用戶。如果用戶已經存在于數據庫中,則會報用戶重復錯誤信息。鏈接db.dropUser(username, writeConcern)從當前數據庫中刪除用戶。鏈接db.dropAllUsers(writeConcern)從當前數據庫中刪除所有用戶。鏈接db.getUser(username, args)返回指定用戶的用戶信息。在用戶所在的數據庫上運行該方法。鏈接db.getUsers()返回數據庫中所有用戶的信息。鏈接db.grantRolesToUser(username, roles, writeConcern)授權用戶角色列表鏈接db.removeUser()根據用戶名從數據庫中刪除指定的用戶。2.6版本以后不建議使用使用db.dropUser()替換。鏈接db.revokeRolesFromUser( username, [ roles ], { writeConcern } )移除一個用戶的一個或多個角色鏈接db.updateUser(username, update, writeConcern)更新運行該方法的數據庫的對應用戶的數據。對字段的更新會完全替換先前字段的值。這包括對用戶角色數組的更新。注:當您更新角色數組時,您會完全替換先前數組的值。所以若要添加或刪除角色,無需替換所有用戶現有角色,請使用db.grantRolesToUser()或db.revokeRolesFromUser()方法。鏈接
角色管理方法(Role Management Methods)
方法名方法功能官網連接db.createRole(role, writeConcern)在數據庫中創建角色(自定義角色)。您可以通過顯示列出權限列表或通過角色繼承來自其他角色或兩者的特權來指定角色的權限。該角色適用于運行該方法的數據庫上。鏈接db.dropRole(rolename, writeConcern)從運行該方法的數據庫中刪除指定的用戶自定義的角色鏈接db.dropAllRoles(writeConcern)從運行該方法的數據庫中刪除所有的用戶自定義的角色鏈接db.getRole(rolename, args)返回指定角色繼承權限的角色列表。同樣,該方法還可以返回該角色的所有權限。在包含該角色的數據庫中運行該方法,該命令可以獲取用戶定義角色(user-defined roles)和內置角色(built-in roles)的信息。鏈接db.getRoles()返回運行該方法的數據庫中所有角色的信息。該方法有無參數都可以運行。如果沒有參數運行,該方法返回數據庫所有用戶定義角色的繼承信息。鏈接db.grantPrivilegesToRole(rolename, privileges, writeConcern)向指定用戶定義角色授予附加權限。鏈接db.revokePrivilegesFromRole(rolename, privileges, writeConcern)從運行該方法的數據庫中刪除指定自定義角色的指定權限鏈接db.grantRolesToRole(rolename, roles, writeConcern)給指定自定義角色授權權限鏈接db.revokeRolesFromRole(rolename, roles, writeConcern)從一個角色中移除指定的繼承角色。鏈接db.updateRole(rolename, update, writeConcern)更新指定的用戶自定義角色,該方法必須運行在該角色所在的數據庫上。注:對角色字段數據的更改會完全覆蓋以前的數據,如果只是增加或刪除某一數據,請參考上列方法。鏈接
副本方法(Replication Methods)
方法名方法功能官網連接rs.add(host, arbiterOnly)添加一個成員到副本集中,若要運行該方法,必須連接到復制集的主集。鏈接rs.addArb(host)給一個現有副本集中添加一個新的仲裁。注:一般來說,盡量避免每個副本集有超過一個的仲裁鏈接rs.conf()返回包含當前副本集配置的文檔。該方法包裝了replSetGetConfig指令鏈接rs.freeze(seconds)使當前副本集在一段時間內放棄精選主集的資格鏈接rs.help()返回用于所有副本集相關shell函數的幫助文本。鏈接rs.initiate(configuration)啟動一個副本集。該方法可以選擇以包含副本集配置信息的文檔形式進行參數化。鏈接rs.printReplicationInfo()2.6版本新功能,以格式化報表打印副本集成員的oplog,所顯示的格式化報表的數據是由db.getReplicationInfo()返回的。rs.printReplicationInfo()的輸出與db.printReplicationInfo()的輸出相同。鏈接rs.printSlaveReplicationInfo()從集合的從成員的角度返回包含副本集狀態的格式化報表,該方法與db.printSlaveReplicationInfo()的輸出完全相同。鏈接rs.reconfig(configuration, force)重新定義現有副本集,覆蓋現有副本集配置。若要運行該方法,必須連接到副本集的主集。鏈接rs.remove(hostname)從當前副本集中刪除參數所描述的成員。此函數會斷開shell鏈接,并將作為復制集重聯且會重新選舉誰將成為主集。因此,即使該命令成功執行,shell也會報錯。鏈接rs.slaveOk()為db.getMongo().setSlaveOk()做一個簡要說明,其允許當前連接同意在從節點運行讀取操作。請參考readPref()方法以便在mongo shell上的讀取操作獲取更細粒度的控制。鏈接rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)將副本集的主節點屬性設為從節點,當主節點降級完成之后,eligble secondaries將會舉行主節點的選舉。該方法不會立刻將主節點降級,如果沒有可以使用的從節點與主節點保持一致,則主節點會等待secondaryCatchUpPeriodSecs參數(默認10秒)讓一個從節點提升為主節點。一旦有可用的空閑從節點,則該方法會將主節點降級。一旦降級,原先的主節點會變成從節點并且在接下來的stepDownSecs參數的時間內沒有資格選舉變成主節點。鏈接rs.syncFrom()提供了一個封裝replSetSyncFrom的包裝器,它允許管理員暫時為當前成員重寫默認同步目標。以[hostname]:[port]格式指定要復制的成員名稱。鏈接
分片方法(Sharding Methods)
方法名方法功能官網連接sh.addShard(url)將一個片副本添加到一個片集群中。此方法必須運行在一個mongos實例上。鏈接sh.addShardTag(shard, tag)將一個片與標記或標識符關聯。mongodb使用這些標識符直接將位于標記范圍內的塊連接到特定的片。該方法將塊范圍與標記范圍關聯起來。3.4版本修改:該方法又名為sh.addShardToZone(),上面的功能仍然適用于3.2版本。3.4版本MongoDB提供Zone sharding作為標記-感知分片的替代品鏈接sh.addShardToZone(shard, zone)3.4版本新功能,將一個片與一個分區關聯起來。mongodb將此片與給定區域關聯。被區域覆蓋的塊被分配給與區域關聯的片。鏈接sh.addTagRange(namespace, minimum, maximum, tag)將一系列片鍵的值附加到使用sh.addShardTag()方法創建的片標記中。3.4版本修改:該方法又名為sh.updateZoneKeyRange(),上面的功能仍然適用于3.2版本。3.4版本MongoDB提供Zone sharding作為標記-感知分片的替代品鏈接sh.disableBalancing(namespace)禁用指定的分片集合的平衡器。這不會影響同一集群中其他分片集合的塊的平衡。注:您只能在mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.enableBalancing(namespace)啟用用于分片集合的指定命名空間的平衡器。注:您只能在mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.disableAutoSplit()3.4版本新功能,禁用在config.settings集合中的自動拆分標志。當啟用了對一個分片集群進行自動拆分功能時,mongodb會從快速增長的塊的片鍵的值自動拆分塊。默認情況下啟用自動拆分。注:您只能使用shell鏈接到mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.enableAutoSplit()3.4版本新功能,啟用分片集群的自動拆分功能。該方法啟用了在config.settings集合中的自動拆分標志。默認情況下啟用自動拆分。注:您只能使用shell鏈接到mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.enableSharding(database)啟用指定數據庫上的分片。這并不自動地將任何集合進行分片處理,而是可以使用sh.shardCollection()啟動分片集合。鏈接sh.getBalancerHost()自3.4版本開始,不推薦使用:從3.4開始,平衡器運行在CSRS(Config Server Replication Set-配置服務器副本集)的主節點上。CSRS的主節點上使用一個名為“ConfigServer”的進程id來持有“balancer”鎖。這個鎖永遠不會釋放。鏈接sh.getBalancerState()該方法用于判斷平衡器是否啟用,這并不能反映平衡操作的當前狀態:使用sh.isBalancerRunning()來檢查平衡器的當前狀態。鏈接sh.removeTagRange(namespace, minimum, maximum, tag)3.0版中的新功能,移除一系列使用sh.addShardTag方法創建的片鍵的值。3.4版本修改:該方法又名為sh.removeRangeFromZone(),上面的功能仍然適用于3.2版本。3.4版本MongoDB提供Zone sharding作為標記-感知分片的替代品鏈接sh.removeRangeFromZone(namespace, minimum, maximum)3.4版本新功能,刪除一系列片鍵的值和區域之間的關聯。鏈接sh.help()返回shell關于所有的分片函數基本的幫助文本。鏈接sh.isBalancerRunning()判斷平衡器進程是否正在運行,且正在遷移塊。使用sh.getBalancerState()來確定是否啟用了平衡器或禁用了平衡器。鏈接sh.moveChunk(namespace, query, destination)將包含符合指定查詢的文檔的塊移動到目標片。該方法提供了一個包裝moveChunk數據庫指令的包裝器鏈接sh.removeShardTag(shard, tag)刪除標記與片之間的關聯。該方法只能運行連接的mongos實例上。3.4版本中更改:該方法別名為sh.removeShardFromZone(),上面的功能仍然適用于3.2版本。3.4版本MongoDB提供Zone sharding作為標記-感知分片的替代品鏈接sh.removeShardFromZone(shard, zone)3.4版本新功能,移除區域與片之間的關聯。鏈接sh.setBalancerState(state)啟用或禁用平衡器。使用sh.getBalancerState()來確定當前是否啟用了平衡器或禁用了平衡器,并使用sh.isBalancerRunning()來檢查其當前狀態。注:您只能使用shell鏈接到mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.shardCollection(namespace, key, unique, options)使用片鍵作為關鍵字來切分集合。鏈接sh.splitAt(namespace, query)以查詢獲得的數據作為片鍵的值來切分塊。鏈接sh.splitFind(namespace, query)將包含以查詢獲得的數據作為片鍵的值的塊從中間切分成兩個相等的塊。相反地,要在特定點上拆分塊,請參考sh.splitAt()。鏈接sh.startBalancer(timeout, interval)在一個分片集群中啟動平衡器。從mongodb 3.4開始,該方法不會等待平衡器來開始。在早期版本中,該方法等待平衡器才啟動。注:您只能使用shell鏈接到mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.status()當運行在一個mongos實例時,打印一個格式化的分片配置報表以及關于一種分片集群中現有塊的信息。如果塊總數大于或等于20,則會默認不顯示詳細的塊信息。鏈接sh.stopBalancer(timeout, interval)3.4版本新功能,禁用一個分片集群中的平衡器。如果平衡進程正在運行中,則會等待平衡器完成平衡操作。注:您只能使用shell鏈接到mongos實例上運行該方法,如果運行在mongod實例上,則會報錯。鏈接sh.waitForBalancer(wait, timeout, interval)等待平衡器狀態的改變,該方法是一個內部的方法。鏈接sh.waitForBalancerOff(timeout, interval)內部方法,等待平衡器停止。鏈接sh.waitForPingChange(activePings, timeout, interval)該方法等待activepings的一個ping狀態的改變,并且只有當指定的ping更改狀態時才返回。鏈接sh.updateZoneKeyRange(namespace, minimum, maximum, zone)3.4版本新方法,將一系列片鍵的值與區域關聯起來.鏈接
對象決策與方法(Object Constructors and Methods)
方法名方法功能官網連接BulkWriteResult()2.6版本新功能。一個包含Bulk.execute()方法返回結果的包裝器鏈接Date()返回當前日期作的字符串或日期對象。date():在shell中返回當前日期的字符串。new date():將當前日期作為日期對象返回。shell使用ISODate助手封裝日期對象,ISODate屬于UTC。鏈接ObjectId(hexadecimal)返回一個新的objectid值。12字節的objectid值包括:4字節值,表示自unix紀元(1970.1.1)以來的秒數,3字節機器標識符,2字節進程id,3字節的以隨機值開頭計數器。鏈接ObjectId.getTimestamp()返回ObjectId()的時間戳部分作為日期鏈接ObjectId.toString()返回ObjectId()的字符串表示形式。此字符串值具有ObjectId(…)的格式。鏈接ObjectId.valueOf()將ObjectId()以小寫十六進制字符串返回。此值是 ObjectId()對象的str屬性。鏈接UUID()生成一個bson uuid對象。鏈接WriteResult()一個包含有mongo shell 寫入方法的結果狀態的封裝器鏈接WriteResult.hasWriteError()判斷mongo shell的寫方法的結果是否具有WriteResult.writeError鏈接WriteResult.hasWriteConcernError()判斷mongo shell的寫方法的結果是否具有WriteResult.writeConcernError鏈接
連接方法(Connection Methods)
方法名方法功能官網連接connect(url, user, password)創建一個與mongodb實例的連接并返回到數據庫的引用。然而,在大多數情況下,使用Mongo()對象及其getDB()方法代替。鏈接Mongo(host)JavaScript構造器從mongo shell或者一個JavaScript文件中實例化一個數據庫鏈接鏈接Mongo.getDB(database)從mongo shell或者一個JavaScript文件中提供一個訪問數據庫的對象鏈接Mongo.getReadPrefMode()返回Mongo()鏈接對象的讀取操作方式鏈接Mongo.getReadPrefTagSet()返回Mongo()鏈接對象的讀取操作標記鏈接Mongo.isCausalConsistency()3.6版本新功能,返回一個當前連接對象是否啟用因果一致性(causal consistency)的布爾值。鏈接Mongo.setCausalConsistency(boolean)3.6版本新功能,啟用或禁用連接對象的因果一致性(causal consistency),注:即使會話可能具有因果一致性,也可能導致因果一致性,因此,在連接對象可能具有因果一致性,反之亦然。鏈接Mongo.setReadPref(mode, tagSet)在一個mongo連接中調用該方法控制客戶端如何將查詢到副本集成員的所有路由。鏈接Mongo.setSlaveOk()對于當前會話,此命令允許從非控制(即從屬或次要)實例進行讀取操作。鏈接Mongo.startSession(options)3.6版本新功能,為一個鏈接開啟一個session,mongo shell將會話id分配給與會話關聯的命令鏈接Session()3.6版本新功能,在mongo shell對象鏈接的session對象鏈接SessionOptions()3.6版本新功能,返回mongo shell對象鏈接的session對象的參數鏈接
本機方法(Native Methods)
方法名方法功能官網連接cat(filename)返回指定文件的內容。該方法使用當前shell會話的輸出返回,不會影響服務器。鏈接cd(path)更改mongo shell的目錄上下文,并且對mongodb服務器沒有任何影響。鏈接copyDbpath()內部應用鏈接fuzzFile(filename)內部應用鏈接getHostName()返回運行mongo shell進程的系統的主機名。鏈接getMemInfo()返回一個包含兩個字段的文檔,用于查看javascript shell進程使用的內存量。返回的字段是resident和virtual的。鏈接hostname()返回運行mongo shell進程的系統的主機名。鏈接listFiles()返回目錄中包含每個對象的文檔的數組。此函數在mongo shell的上下文中運行。鏈接load(file)加載并運行一個javascript文件到當前shell環境中。鏈接ls()返回當前目錄中文件的列表。鏈接md5sumFile(filename)返回指定文件的md5哈希值。鏈接mkdir(path)在指定路徑中創建目錄。運行mongo shell的用戶必須擁有在指定路徑中創建目錄的權限。鏈接pwd()返回當前目錄。(經測試解釋沒問題,但是它的名字太有誤導性了)鏈接quit()退出當前shell會話。鏈接removeFile(filename)從本地文件系統中刪除指定的文件。鏈接resetDbpath()內部應用鏈接sleep(ms)在指定時間內暫停javascript執行上下文。鏈接setVerboseShell()該方法使指示mongo shell打印每個操作的持續時間。鏈接version()返回mongo shell 版本字符串,在2.4版本以前,該方法只是打印版本號,但是不是字符串鏈接_isWindows()判斷當前mongo shell運行的系統是不是windows系統鏈接_rand()返回介于0和1之間的隨機數。鏈接_srand()內部應用鏈接
在linux中使用ls命令 ls -lh 可以顯示文件或者目錄大小,下面是顯示列內容說明
第一列:文件類型和權限
第二列:鏈接數量
第三列:所有者 - 顯示文件或目錄的所有者用戶名稱
第四列:顯示文件或者目錄用戶組
第五列:顯示文件的大小。單位為字節
第六列:顯示文件最后的修改時間和日期
第七列:顯示文件或者目錄名稱====================ls -l:以長格式列出文件和目錄,包括權限、所有者、大小和最后修改時間
ls -a:顯示所有文件,包括以點(.)開頭的隱藏文件
ls -lt:按時間排序,最新修改的文件或目錄會顯示在最前面
ls -lh:結合 -l 和 -h 選項,以易讀的格式顯示文件大?。ɡ纾褂肒B、MB)
cd /home/user/Documents 切換到指定目錄下
cd ..:切換到當前目錄的父目錄(返回到上一級目錄)
cat cbus_onl_busi.log 顯示文件filename的內容
cat -n cbus_onl_busi.log 顯示文件filename的內容,并在每行前面顯示行號
cat cbus_onl_busi.log | tail -n 10 顯示文件filename的最后幾行
grep "pattern" cbus_onl_busi.log | cat -n:使用grep搜索包含特定模式的行,然后通過管道將其傳遞給cat,并使用cat的-n選項顯示行號
cat al-gateway-oapi.log | grep 'error' | tail -n 10
打開文件后,more默認顯示第一屏的內容
按Space鍵可以翻到下一頁 按Enter鍵可以翻到下一行
按b鍵可以回退到上一頁
按q鍵退出more
按Space鍵(空格鍵)可以向前翻一頁 按b鍵可以向后翻一頁
按q鍵退出less
按:n可以顯示當前行號
touch newfile.txt 使用touch命令創建空文件
ls -l:在使用touch命令后,通常使用ls -l命令查看文件的時間戳和其他狀態信息
cp source destination:將名為source的文件復制到destination。如果destination是目錄,則文件將被復制到該目錄中
cp file1 file2 file3 destination:將多個文件復制到指定的destination目錄
cp -r source destination:遞歸地復制整個目錄source及其內容到destination。-r選項表示遞歸。
移動文件:
mv source destination:將名為source的文件移動到destination。如果destination是目錄,則文件將被移動到該目錄中
移動目錄:
mv -r source destination:遞歸地移動整個目錄source及其內容到destination。-r選項表示遞歸
重命名文件:
mv oldname newname:將文件從oldname重命名為newname
rm命令是非常危險的,特別是當使用-r選項時,因為它可以遞歸地刪除大量文件;如果不確定,可以使用-i選項,它會在刪除每個文件之前提示確認。
刪除文件:
rm filename 這將刪除名為filename的文件。
刪除目錄:
rm -r directory -r(或--recursive)選項用于遞歸地刪除目錄及其內容
強制刪除:
rm -f file -f(或--force)選項用于強制刪除文件,不提示確認
強制刪除只讀文件:
rm -i file -i選項在刪除每個文件之前提示確認,對于只讀文件特別有用
刪除舊文件:
rm -t 7 file -t選項刪除訪問時間超過7天的文件。
按名稱搜索:
find /path/to/search -name "filename" -name選項用于按文件名搜索
使用通配符:
find /path/to/search -name "*.txt" 使用通配符*可以搜索所有擴展名為.txt的文件
按大小搜索:
find /path/to/search -size +100M -size選項用于按文件大小搜索,+100M表示大于100MB的文件
根目錄開始查找所有擴展名為 .log 的文本文件,并找出包含 “ERROR” 的行
find / -type f -name "*.log" | xargs grep "ERROR"
根目錄開始查找所有擴展名為 .log 的文本文件,并找出包含 “20240607310111936703” 的文件路徑
find /data/logs/pm-service-onl/busi/20240607 -name "*.log" -exec zgrep "20240607310111936703" {} \; -print
搜索文本:
grep "pattern" 310H001.log
遞歸搜索:選項遞歸地在指定目錄及其子目錄中搜索
grep -r "pattern" /path/to/search
使用前綴和后綴:-B選項打印每個匹配行之前的行,-A選項打印之后。數字指定要打印的行數
grep "pattern" 310H001.log -B 20 -A 10
搜索多個模式:使用\|操作符在單個命令中搜索多個模式
grep "pattern1\|pattern2" 310H001.log
查看文件的前10行
head -n 10 /var/log/syslog/test.log
顯示文件的第N行到第M行
head -n M test.log | tail -n +N
指定顯示的行數: -n選項允許你指定顯示的行數,lines是你想要顯示的行數
tail -n 20 /var/log/syslog/test.log
實時顯示文件新增內容: -f選項用于實時查看文件的新增內容,通常用于查看日志文件。
tail -f /var/log/syslog/test.log
sort /etc/passwd/test.log
計算行數:
wc -l /var/log/syslog/test.log
只顯示總計: 使用管道和awk命令只顯示總計
wc -l file1 file2 file3 | awk '{total +=$1} END {print total}'
cut -d: -f1 /etc/passwd
nano /home/user/file.txt
vi /home/user/file.txt
emacs /home/user/file.txt
paste file1.txt file2.txt
find / -name '*.log'
參考1文件命令
grep 'error' /var/log/syslog
locate myFile.txt
which java
參考16其他命令說明
whereis ls
參考16其他命令說明
mkdir /home/user/new_directory
rmdir /home/user/empty_directory
tree /home/user/
du -sh /home/user/Documents
可以參考 9磁盤命令管理
df -h
可以參考 9磁盤命令管理
chmod 755 /home/user/file.txt
表示設置文件的主用戶有讀,寫和執行權限(rwx=7),同組的用戶和其他用戶有讀和執行權限(rx=5)。
chown newuser:newgroup /home/user/file.txt
表示將/home/user/file.txt的所有者更改為newuser,所屬的組更改為newgroup。
chgrp newgroup /home/user/file.txt
表示將/home/user/file.txt的所屬的組更改為newgroup。
測試與 www.example.com 的網絡連通性
ping www.baidu.com
顯示 eth0 網絡接口的信息
ifconfig eth0
開啟 eth0 網絡接口
sudo ifconfig eth0 up
關閉 eth0 網絡接口
sudo ifconfig eth0 down
用于列出所有監聽的 TCP 端口以及與之關聯的進程
netstat -ntlp
用于查找所有與端口 80 相關的網絡連接,包括監聽和已建立的連接
netstat -aonp|grep 80
用于計算與端口 80 相關的網絡連接數量
netstat -nat|grep -i "80"|wc -l
ssh user@remote_host
scp /path/to/file user@remote_host:/remote/path/
curl www.linuxyz.cn
curl -H "Content-Type:application/json" -X POST -d '{"appId": "akulaku-business","data": "081915122488","token": "963444d4-88f9-4c38-b2c2-19b60b2d8"}' 'http://pre-oapi.akulaku.local/midendkmshttp/encrypt'
這將嘗試連接到 example.com 的 23 號端口(Telnet 默認端口),并開始一個 Telnet 會話 :一般用來檢查網絡是否通
telnet example.com 23
ftp ftp_server
wget www.linuxyz.cn -o google.html
參考11 進程管理命令
參考11 進程管理命令
echo 'Hello, World!'
printf 'Name: %s\nAge: %d\n' 'Alice' 20
echo 'Hello, World!' | sed 's/World/Shell/g'
echo -e 'name\tage\nAlice\t20\nBob\t22' | awk '{if ($2 >=21) print $1}'
創建歸檔文件: directory/ 目錄下的所有文件和子目錄打包成 archive.tar.gz 歸檔文件,并使用 gzip 壓縮
tar -czvf archive.tar.gz directory/
解壓歸檔文件:從 archive.tar.gz 歸檔文件中解壓所有文件到當前目錄
tar -xzvf archive.tar.gz
查看歸檔文件內容:列出 archive.tar.gz 歸檔文件中的所有文件和目錄
tar -tvf archive.tar.gz
gzip:用于文件壓縮或解壓。
壓縮文件:
gzip file.txt
解壓文件:
gzip -d file.txt.gz
gunzip file.gz
zip -r archive.zip folder
unzip archive.zip
sudo hdparm -i /dev/sda
顯示所有進程,按 CPU 使用率排序:
ps aux --sort=-%cpu
結合 grep 命令來過濾輸出結果:
ps aux | grep java
ps -ef | grep java
統計當前系統線程數量:
pstree -p|wc -l
終止 PID 為 1234 的進程:
kill 1234
優雅地終止 PID 為 5678 的進程:
kill -SIGTERM 5678
強制終止 PID 為 9101 的進程:使用 kill -9 強制終止進程時需謹慎,因為這會導致進程立即退出,可能不會釋放其占用的資源,也不會執行任何清理操
kill -9 9101
pkill process_name
輸入:set
輸出:展示所環境變量以及函數
輸入:
export VARName='Value'
echo $VARName
輸出結果:
Value
輸入:sudo halt
輸入:sudo reboot
關閉系統:sudo shutdown -h now
重啟系統:sudo shutdown -r now
更改密碼:passwd
打開文件:
vi vhost.conf
進入編輯模式:
當你第一次打開文件時,你會進入“普通模式”(Normal Mode)。
按下i鍵進入“插入模式”(Insert Mode),在這里可以開始編輯文件。
退出編輯器:
在普通模式下,按下:鍵,然后輸入q(表示退出)并按Enter鍵退出編輯器。
保存并退出:
在普通模式下,按下:鍵,然后輸入wq(表示寫入并退出)并按Enter鍵保存更改并退出編輯器。
撤銷更改:
在普通模式下,輸入u鍵撤銷最近的操作。
查找文本:
在普通模式下,按下:/ 鍵,然后輸入要查找的文本,并按Enter鍵。查找zone :/zone
跳轉到行:
在普通模式下,按下:鍵,輸入行號并按Enter鍵跳轉到指定行號。
設置行號:
在普通模式下,按下:鍵,輸入set number或簡寫為set nu啟用行號顯示。
復制和粘貼:
在普通模式下,使用v(可視模式)選擇文本,然后使用y(復制)復制文本,再使用p(粘貼)粘貼文本
whereis:當你需要快速找到命令的多個相關文件(如二進制、源代碼、手冊頁)時使用。
which:當你只需要知道某個命令的可執行文件路徑時使用。
whereis:默認會在/usr/bin, /bin, /usr/sbin, /sbin, /usr/local/bin等標準目錄下搜索。
which:只搜索PATH環境變量中列出的目錄。
輸入:whoami
輸出:user
輸入:date
輸出: Tue Dec 21 02:16:12 UTC 2021
顯示歷史命令:
history
顯示特定數量的歷史命令:
history 10
查看特定用戶的命令歷史:-u選項用于查看指定用戶username的命令歷史
history -u username
搜索歷史命令:
history | grep "search_pattern"
*請認真填寫需求信息,我們會在24小時內與您取得聯系。