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 选项,以易读的格式显示文件大小(例如,使用KB、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小时内与您取得联系。