MongoDB的Shell操作
<h2 id="前言">前言</h2><p>本文从介绍了MongoShell 的配置、脚本、数据类型和其他指令。</p>
<h2 id="mongoshell---简介">MongoShell - 简介</h2>
<p>MongoShell是一个互动的JavaScript接口的MongoDB,可以使用MongoShell来查询和更新数据以及执行管理操作。</p>
<p>MongoShell是MongoDB发行版的一个组件, 安装并启动MongoDB后,将MongoShell连接到正在运行的MongoDB实例,MongoDB手册中的大多数示例使用 MongoShell,然而,许多驱动程序也提供了与MongoDB类似的接口。</p>
<h3 id="启动mongoshell">启动MongoShell:</h3>
<p>在启动MongoShell之前请确保MongoDB 实例在运行,在Terminal 中键入Mongo则可以直接启动。</p>
<p>示例代码:</p>
<pre><code class="language-shell">➜~ mongo
MongoDB shell version v3.4.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.3
Server has startup warnings:
2017-10-19T10:41:29.922+0800 I CONTROL
2017-10-19T10:41:29.923+0800 I CONTROL ** WARNING: Access control is not enabled for the database.
2017-10-19T10:41:29.923+0800 I CONTROL ** Read and write access to data and configuration is unrestricted.
2017-10-19T10:41:29.923+0800 I CONTROL
> db.version()
3.4.3
</code></pre>
<h3 id="选项参数">选项/参数:</h3>
<p>当没有任何参数运行mongo时,mongo shell将尝试连接到端口27017上的localhost接口上运行的MongoDB实例。</p>
<h4 id="链接选项">链接选项:</h4>
<p>如果需要链接非27017端口或者远程实例,则可以使用以下语法来链接:</p>
<pre><code class="language-shell">mongo --username <user> --password <pass> --host <host> --port 28015
</code></pre>
<p>或者简写为:</p>
<pre><code class="language-shell">mongo -u <user> -p <pass> --host <host> --port 28015
</code></pre>
<h4 id="mongorcjs文件">.mongorc.js文件:</h4>
<p>当启动的时候,mongo检查用户HOME目录下的一个JavaScript文件<code>.mongorc.js</code>,如果找到mongo在首次显示提示信息前解析.mongorc.js的内容。如果你使用shell执行一个JavaScript文件或计算表达式,要么通过在命令行使用--eval选项或者指定一个.js文件给mongo,mongo会在完成JavaScript的处理后读取.mongorc.js文件。你可以使用--norc选项来阻止加载.mongorc.js。</p>
<h4 id="使用mongoshell">使用MongoShell:</h4>
<p>测试数据:(这个 employee 对象是包含 3 个员工记录的数组)</p>
<pre><code class="language-json">
{
"employees":[
{
"firstName":"Bill",
"lastName":"Gates"
},
{
"firstName":"George",
"lastName":"Bush"
},
{
"firstName":"Thomas",
"lastName":"Carter"
}
]
}
</code></pre>
<ul>
<li>显示当前正在使用的数据库:</li>
</ul>
<pre><code class="language-shell">> db
test
</code></pre>
<ul>
<li>查看所有数据库:</li>
</ul>
<pre><code class="language-shell">> show dbs
admin0.000GB
local0.000GB
> show databases
admin0.000GB
local0.000GB
</code></pre>
<p>使用<code>show dbs</code>或者<code> show databases</code>可以达到同样的效果。</p>
<ul>
<li>切换到另一个数据库:</li>
</ul>
<pre><code>> use mydb
switched to db mydb
</code></pre>
<p>可以切换到一个不存在数据库,当创建集合时,这个数据库会被自动创建。</p>
<ul>
<li>插入一条数据:</li>
</ul>
<pre><code class="language-shell">> db.emp.insertOne({x : 1});
{
"acknowledged" : true,
"insertedId" : ObjectId("59e87617052057c4236c259a")
}
</code></pre>
<p>其中 db指的是当前的数据库,emp 指的是要插入的集合的名称。</p>
<ul>
<li>查看当前数据库中所有集合:</li>
</ul>
<pre><code class="language-shell">> show collections
emp
</code></pre>
<ul>
<li>查看集合中的数据:</li>
</ul>
<pre><code class="language-shell">> db.emp.find()
{ "_id" : ObjectId("59e87617052057c4236c259a"), "x" : 1 }
</code></pre>
<h4 id="格式化输出结果">格式化输出结果:</h4>
<p>要格式化打印结果,可以将.pretty()添加到操作中,如下所示:</p>
<pre><code class="language-json">> db.emp.find().pretty()
{
"_id": ObjectId("59e87617052057c4236c259a"),
"x": 1
}
</code></pre>
<p>此外,可以在 mongo shell中使用下面的显式打印方法:</p>
<ul>
<li>print() 无格式打印</li>
<li>print(tojson(<obj>)) 用 JSON 格式打印,等效于 printjson()</obj></li>
<li>printjson() 用 JSON 格式打印,等效于 print(tojson(<obj>))</obj></li>
</ul>
<h4 id="shell-中的多行操作">shell 中的多行操作:</h4>
<p>如果你的代码行以左括号 (<code>'('</code>),左大括号 (<code>'{'</code>)或左中括号 (<code>'['</code>) 结束,那么随后的一行将以省略号 (<code>"..."</code>) 开始,直到你输入对应的右括号 (<code>')'</code>),右大括号 (<code>'}'</code>)或右中括号 (<code>']'</code>) 。 mongoshell在执行代码以前将一直等待右括号,右大括号或右中括号,如下例所示:</p>
<pre><code class="language-shell">> if ( x > 0 ) {
... count++;
... print (x);
... }
</code></pre>
<p>也可以通过按下两次回车键来结束这次输入:</p>
<pre><code class="language-shell">> if (x > 0
...
...
>
</code></pre>
<h4 id="退出-shell-操作">退出 shell 操作:</h4>
<p>在MongoShell中输入<code>quit()</code>或者按下 <code>Ctrl+C</code>的组合键方式来结束 shell。</p>
<h2 id="mongoshell---配置">MongoShell - 配置</h2>
<h3 id="自定义提示符">自定义提示符:</h3>
<p>可以通过在 MongoShell中设置变量 prompt 的值来修改提示符的内容。prompt 变量可以存储字符串以及JavaScript代码。 如果 prompt 为返回字符串的函数, mongo 则会在每个提示符中展示动态信息。</p>
<h4 id="显示当前shell的操作数">显示当前Shell的操作数:</h4>
<p>显示当前MongoShell 的操作数量,示例代码:</p>
<pre><code class="language-shell">cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}
</code></pre>
<p>配置好之后,提示符会变成这样:</p>
<pre><code class="language-shell">1>
2>
3>
</code></pre>
<h4 id="显示数据库和主机名">显示数据库和主机名:</h4>
<p>示例代码:</p>
<pre><code class="language-shell">host = db.serverStatus().host;
prompt = function() {
return db+"@"+host+"$ ";
}
</code></pre>
<p>提示符将会变成如下样式:</p>
<pre><code class="language-shell">test@HostName$
</code></pre>
<h4 id="显示mongo服务的启动时间以及文档数">显示Mongo服务的启动时间以及文档数:</h4>
<p>示例代码:</p>
<pre><code class="language-shell">prompt = function() {
return "Uptime:"+db.serverStatus().uptime+" Documents:"+db.stats().objects+" > ";
}
</code></pre>
<p>提示符将会变成如下样式:</p>
<pre><code class="language-SHELL">Uptime:90104 Documents:0 >
</code></pre>
<p><strong>以上关于 prompt的相关配置均可以在 MongoShell中直接输入配置,也可以将其写入再<code>.mongorc.js</code>文件中。</strong></p>
<h3 id="使用外部编辑器">使用外部编辑器:</h3>
<p>可以通过在启动 MongoShell之前设置 EDITOR环境变量来在MongoShell中使用自己的编辑器。</p>
<pre><code class="language-shell">➜~ export EDITOR=vim
➜~ mongo
</code></pre>
<p>进入MongoShell 之后,可以输入edit <function>使用之前定义的 vim 编辑器来编辑代码。</function></p>
<p>示例代码:</p>
<ol>
<li>定义函数:</li>
</ol>
<pre><code class="language-shell">function myFunc () { }
</code></pre>
<ol start="2">
<li>使用指定的编辑器来编辑函数:</li>
</ol>
<pre><code class="language-shell">edit myFunc
</code></pre>
<p>此命令可以打开 Vim 编辑会话。当编辑完成之后,保存并退出编辑会话。</p>
<ol start="3">
<li>调用函数:</li>
</ol>
<p>直接在 shell 中输入函数名可以查看函数体,输入函数名() 可以调用函数。</p>
<h3 id="修改批处理大小">修改批处理大小:</h3>
<p><code>db.collection.find()</code>方法是从集合中检索文档的JavaScript方法。<br>
<code>db.collection.find()</code>方法返回一个游标到结果;然而,在mongo shell中,如果返回的游标未使用var关键字分配给变量,则光标自动迭代最多20次,以打印到与查询匹配的前20个文档。 mongo shell将提示键入它再次迭代20次。</p>
<p>可以设置 <code>DBQuery.shellBatchSize</code> 属性来修改默认的 <code>20</code> 篇文档数。</p>
<p>示例代码:</p>
<pre><code class="language-shell">DBQuery.shellBatchSize = 10;
</code></pre>
<p>改为10。</p>
<h2 id="mongoshell---脚本">MongoShell - 脚本</h2>
<p>我们可以在操作MongoDB中的数据或执行管理操作的JavaScript中为mongo shell编写脚本。</p>
<h3 id="打开新链接">打开新链接:</h3>
<p>在MongoShell或者 JavaScript文件中,可以使用 Mongo() 构造函数来实例化数据库连接:</p>
<pre><code class="language-shell">new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)
</code></pre>
<p>考虑下面的示例,实例化一个到本机默认端口上运行的MongoDB实例的新连接,并且使用 getDB()方法将全局的 <code>db</code> 变量设置为 <code>myDatabase</code>:</p>
<pre><code>conn = new Mongo();
db = conn.getDB("mydb");
</code></pre>
<p>如果连接到一个需要读取控制的MongoDB实例,你可以使用 <code>db.auth()</code>方法进行授权。</p>
<p>此外,你可以使用 <code>connect()</code> 方法连接到MongoDB实例。下面的示例 连接到运行在 <code>localhost</code> 非默认端口 <code>27020</code> 上的MongoDB实例,并且设置了全局的 <code>db</code> 变量:</p>
<pre><code>db = connect("localhost:27020/mydb");
</code></pre>
<h3 id="交互式-shell-和mongo-脚本的区别">交互式 shell 和mongo 脚本的区别:</h3>
<ol>
<li>要使用db全局变量,请使用getDB()方法或connect()方法。可以将数据库引用分配给非db以外的变量。</li>
<li>默认情况下,在mongo shell中的写入操作使用写入的{w:1}。如果执行批量操作,请使用Bulk()方法。</li>
<li>不能在JavaScript文件中使用任何shell 指令,因为它们不是有效的JavaScript,下文附对照表。</li>
<li>交互模式下,mongo打印包含所有游标内容的操作结果。在脚本中,可以使用JavaScript的 print()函数或返回格式化的JSON的mongo specific printjson()函数。</li>
</ol>
<p>下表将最常见的mongo shell助手映射到JavaScript等效项:</p>
<table>
<thead>
<tr>
<th>Shell 指令</th>
<th>JavaScript 操作方式</th>
</tr>
</thead>
<tbody>
<tr>
<td>show dbs ,show databases</td>
<td>db.adminCommand('listDatabases')</td>
</tr>
<tr>
<td>use <db></db></td>
<td>db = db.getSiblingDB('<db>')</db></td>
</tr>
<tr>
<td>show collections</td>
<td>db.getCollectionNames()</td>
</tr>
<tr>
<td>show users</td>
<td>db.getUsers()</td>
</tr>
<tr>
<td>show roles</td>
<td>db.getRoles({showBuiltinRoles: true})</td>
</tr>
<tr>
<td>show log <logname></logname></td>
<td>db.adminCommand({ 'getLog' : '<logname>' })</logname></td>
</tr>
<tr>
<td>show logs</td>
<td>db.adminCommand({ 'getLog' : '*' })</td>
</tr>
<tr>
<td>it</td>
<td>cursor = db.collection.find()if ( cursor.hasNext() )</td>
</tr>
</tbody>
</table>
<h3 id="--evel选项">--evel选项:</h3>
<p>使用--eval选项来将mongo传递给一个JavaScript代码片段。</p>
<pre><code class="language-shell">➜~ mongo mydb --eval "printjson(db.getCollectionNames())"
MongoDB shell version v3.4.3
connecting to: mongodb://127.0.0.1:27017/mydb
MongoDB server version: 3.4.3
[ "emp", "stores" ]
</code></pre>
<h3 id="执行-javascript-文件">执行 JavaScript 文件:</h3>
<p>MongoShell 可以 指定一个 .js 文件, mongo 将会直接运行JavaScript。</p>
<pre><code class="language-shell">mongo localhost:27017/test myjsfile.js
</code></pre>
<p>该操作在连接到<code>localhost</code> 接口 <code>27017</code> 端口 <code>mongod</code> 实例上 <code>test</code> <em>database</em> 的:program:mongo shell 中执行 <code>myjsfile.js</code> 脚本。</p>
<p>可以在MongoShell中使用 <code>load()</code> 函数运行 .js文件,如下所示:</p>
<pre><code>load("demo.js")
</code></pre>
<p>该函数导入并运行了 <code>demo.js</code> 文件。</p>
<p><code>load()</code> 方法可接受相对路径和绝对路径。如果 <code>mongo</code> shell 当前的工作目录位于 <code>/data/db</code>, 而文件<code>demo.js</code> 位于 <code>/data/db/scripts</code> 目录,那么下面两种在 <code>mongo</code> 中的调用将会是同样的效果。</p>
<pre><code>load("scripts/myjstest.js")
load("/data/db/scripts/demo.js")
</code></pre>
<h2 id="mongoshell---数据类型">MongoShell - 数据类型</h2>
<p>MongoDB BSON提供了除 JSON之外其它数据类型的支持。 Drivers提供了对这些数据类型在主机语言的本地化支持,MongoShell 也提供了一些帮助类来支持这些数据类型在 mongo JavaScript shell 中的使用。</p>
<h3 id="检查类型">检查类型:</h3>
<p>如果想要确定字段类型,MongoShell提供了 <code>instanceof</code> 和 <code>typeof</code> 操作符。</p>
<h4 id="instanceof">instanceof:</h4>
<p>instanceof 返回一个布尔值来验证一个值是否为某些类型的实例。</p>
<h4 id="typeof">typeof:</h4>
<p>typeof 返回一个字段的类型。</p>
<h3 id="数据类型">数据类型:</h3>
<h4 id="日期类型">日期类型:</h4>
<p>MongoShell 提供了多种方法返回日期,要么通过字符串要么通过 Date 对象。</p>
<ul>
<li><code>Date()</code> 方法返回当前日期为一个字符串。</li>
<li><code>new Date()</code> 构造函数返回一个使用 <code>ISODate()</code> 包装返回的 <code>Date</code> 对象。</li>
<li><code>ISODate()</code> 构造函数返回一个使用 <code>ISODate()</code> 包装返回的 <code>Date</code> 对象。</li>
</ul>
<p>内部来看, ref:document-bson-type-date 对象被存储为一个表示距离 Unix 纪元(1970年1月1日)毫秒数的64位整数,这就意味着一个可表示的日期范围:从距离过去到将来的29亿年。</p>
<h5 id="返回string">返回string:</h5>
<p>如果想要返回日期为一个字符串,使用 <code>Date()</code> 方法。</p>
<p>示例代码:</p>
<pre><code class="language-shell">1> var mydate= Date(); # 创建日期类型的变量
2> mydate # 查看变量的值
Mon Oct 23 2017 14:30:47 GMT+0800 (CST)
3> typeof(mydate) # 获取查看变量的类型
string
</code></pre>
<h5 id="返回date">返回Date:</h5>
<p>MongoShell使用ISODate帮助程序包装Date类型的对象。但是,对象仍然是Date类型。</p>
<pre><code class="language-shell">1> var myDate = new Date();
2> var myISODate = new ISODate();
3> myDate
ISODate("2017-10-23T06:59:56.039Z")
4> myISODate
ISODate("2017-10-23T07:00:09.831Z")
5> myDate instanceof Date # 验证类型
true
6> myISODate instanceof Date # 验证类型
true
</code></pre>
<h4 id="objectid">ObjectId:</h4>
<p>MongoShell围绕ObjectId数据类型提供ObjectId()包装器类。</p>
<p>示例代码:</p>
<pre><code class="language-shell">1> new ObjectId(); # 生成一个 ObjectId
ObjectId("59ed998b6d3acf0e7aac525c")
</code></pre>
<h4 id="numberlong">NumberLong:</h4>
<p>默认情况下,MongoShell将所有数字视为浮点值(floating-point values)。MongoShell提供NumberLong()包装器来处理64位整数。</p>
<p>示例代码:</p>
<pre><code class="language-shell">
11> NumberLong("2090845886852") # NumberLong()包装器接受long作为字符串:
NumberLong("2090845886852")
</code></pre>
<h4 id="numberint">NumberInt:</h4>
<p>NumberInt() 构造函数来显式指定 32位整数。</p>
<h4 id="numberdecimal">NumberDecimal:</h4>
<p>NumberDecimal()构造函数限制指定 128位 基于十进制的浮点值,能够以精确的精度仿效十进制近似值。 这个功能专为处理 monetary data 的应用而设计,例如金融、税务以及科学计算等。</p>
<h2 id="mongoshell---其他命令">MongoShell - 其他命令</h2>
<h3 id="历史命令">历史命令:</h3>
<p>可以使用向上和向下箭头键检索MongoShell中发出的以前的命令。命令历史存储在<code>~/.dbshell</code>文件中。</p>
<p>示例代码:</p>
<pre><code class="language-shell">cat ~/.dbshell
</code></pre>
<h3 id="常用命令">常用命令:</h3>
<table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>help</td>
<td>查看帮助</td>
</tr>
<tr>
<td>db.help()</td>
<td>查看数据库的操作帮助</td>
</tr>
<tr>
<td>db.<collection>.help()</collection></td>
<td>显示集合的操作文档(集合可以是不存在的)</td>
</tr>
<tr>
<td>show dbs</td>
<td>显示当前服务器上所有数据库的列表</td>
</tr>
<tr>
<td>use <db></db></td>
<td>切换数据库到 <code><db></code>(数据库可以是不存在的)</td>
</tr>
<tr>
<td>show collections</td>
<td>显示当前数据库的所有集合的列表</td>
</tr>
<tr>
<td>show users</td>
<td>显示当前数据库的用户列表</td>
</tr>
<tr>
<td>show roles</td>
<td>显示用于当前数据库的用户定义和内置的所有角色的列表。</td>
</tr>
<tr>
<td>show profile</td>
<td>显示最近的五个操作命令</td>
</tr>
<tr>
<td>show databases</td>
<td>显示所有可用数据库列表。</td>
</tr>
<tr>
<td>load()</td>
<td>加载执行JavaScript脚本文件</td>
</tr>
</tbody>
</table>
<h3 id="命令行启动选项">命令行启动选项:</h3>
<p>MongoShell 启动时可以使用一些选项。</p>
<table>
<thead>
<tr>
<th>选项</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>--help</td>
<td>显示命令行选项</td>
</tr>
<tr>
<td>--nodb</td>
<td>启动MongoShell而不连接到数据库</td>
</tr>
<tr>
<td>--shell</td>
<td>与 js 文件一起使用</td>
</tr>
</tbody>
</table>
<h2 id="参考资料">参考资料:</h2>
<p>MongoDB 中文社区: http://www.mongoing.com/docs/mongo.html</p>
<p>MongoDB 官网文档: https://docs.mongodb.com/manual/mongo/</p>
<p>MongoShell引用方法: https://docs.mongodb.com/manual/reference/method/</p><br><br>
来源:https://www.cnblogs.com/zhangyangdev/p/11546063.html
頁:
[1]