前言

本文从介绍了MongoShell 的配置、脚本、数据类型和其他指令。

MongoShell - 简介

MongoShell是一个互动的JavaScript接口的MongoDB,可以使用MongoShell来查询和更新数据以及执行管理操作。

MongoShell是MongoDB发行版的一个组件, 安装并启动MongoDB后,将MongoShell连接到正在运行的MongoDB实例,MongoDB手册中的大多数示例使用 MongoShell,然而,许多驱动程序也提供了与MongoDB类似的接口。

启动MongoShell:

在启动MongoShell之前请确保MongoDB 实例在运行,在Terminal 中键入Mongo则可以直接启动。

示例代码:

➜  ~ 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 [initandlisten]
2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2017-10-19T10:41:29.923+0800 I CONTROL [initandlisten]
> db.version()
3.4.3

选项/参数:

当没有任何参数运行mongo时,mongo shell将尝试连接到端口27017上的localhost接口上运行的MongoDB实例。

链接选项:

如果需要链接非27017端口或者远程实例,则可以使用以下语法来链接:

mongo --username <user> --password <pass> --host <host> --port 28015

或者简写为:

mongo -u <user> -p <pass> --host <host> --port 28015

.mongorc.js文件:

当启动的时候,mongo检查用户HOME目录下的一个JavaScript文件.mongorc.js,如果找到mongo在首次显示提示信息前解析.mongorc.js的内容。如果你使用shell执行一个JavaScript文件或计算表达式,要么通过在命令行使用--eval选项或者指定一个.js文件给mongo,mongo会在完成JavaScript的处理后读取.mongorc.js文件。你可以使用--norc选项来阻止加载.mongorc.js。

使用MongoShell:

测试数据:(这个 employee 对象是包含 3 个员工记录的数组)


{
"employees":[
{
"firstName":"Bill",
"lastName":"Gates"
},
{
"firstName":"George",
"lastName":"Bush"
},
{
"firstName":"Thomas",
"lastName":"Carter"
}
]
}
  • 显示当前正在使用的数据库:
> db
test
  • 查看所有数据库:
> show dbs
admin 0.000GB
local 0.000GB
> show databases
admin 0.000GB
local 0.000GB

使用show dbs或者 show databases可以达到同样的效果。

  • 切换到另一个数据库:
> use mydb
switched to db mydb

可以切换到一个不存在数据库,当创建集合时,这个数据库会被自动创建。

  • 插入一条数据:
> db.emp.insertOne({x : 1});
{
"acknowledged" : true,
"insertedId" : ObjectId("59e87617052057c4236c259a")
}

其中 db指的是当前的数据库,emp 指的是要插入的集合的名称。

  • 查看当前数据库中所有集合:
> show collections
emp
  • 查看集合中的数据:
> db.emp.find()
{ "_id" : ObjectId("59e87617052057c4236c259a"), "x" : 1 }

格式化输出结果:

要格式化打印结果,可以将.pretty()添加到操作中,如下所示:

> db.emp.find().pretty()
{
"_id": ObjectId("59e87617052057c4236c259a"),
"x": 1
}

此外,可以在 mongo shell中使用下面的显式打印方法:

  • print() 无格式打印
  • print(tojson()) 用 JSON 格式打印,等效于 printjson()
  • printjson() 用 JSON 格式打印,等效于 print(tojson())

shell 中的多行操作:

如果你的代码行以左括号 ('('),左大括号 ('{')或左中括号 ('[') 结束,那么随后的一行将以省略号 ("...") 开始,直到你输入对应的右括号 (')'),右大括号 ('}')或右中括号 (']') 。 mongoshell在执行代码以前将一直等待右括号,右大括号或右中括号,如下例所示:

> if ( x > 0 ) {
... count++;
... print (x);
... }

也可以通过按下两次回车键来结束这次输入:

> if (x > 0
...
...
>

退出 shell 操作:

在MongoShell中输入quit()或者按下 Ctrl+C的组合键方式来结束 shell。

MongoShell - 配置

自定义提示符:

可以通过在 MongoShell中设置变量 prompt 的值来修改提示符的内容。prompt 变量可以存储字符串以及JavaScript代码。 如果 prompt 为返回字符串的函数, mongo 则会在每个提示符中展示动态信息。

显示当前Shell的操作数:

显示当前MongoShell 的操作数量,示例代码:

cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}

配置好之后,提示符会变成这样:

1>
2>
3>

显示数据库和主机名:

示例代码:

host = db.serverStatus().host;

prompt = function() {
return db+"@"+host+"$ ";
}

提示符将会变成如下样式:

test@HostName$

显示Mongo服务的启动时间以及文档数:

示例代码:

prompt = function() {
return "Uptime:"+db.serverStatus().uptime+" Documents:"+db.stats().objects+" > ";
}

提示符将会变成如下样式:

Uptime:90104 Documents:0 >

以上关于 prompt的相关配置均可以在 MongoShell中直接输入配置,也可以将其写入再.mongorc.js文件中。

使用外部编辑器:

可以通过在启动 MongoShell之前设置 EDITOR环境变量来在MongoShell中使用自己的编辑器。

➜  ~ export EDITOR=vim
➜ ~ mongo

进入MongoShell 之后,可以输入edit 使用之前定义的 vim 编辑器来编辑代码。

示例代码:

  1. 定义函数:
function myFunc () { }
  1. 使用指定的编辑器来编辑函数:
edit myFunc

此命令可以打开 Vim 编辑会话。当编辑完成之后,保存并退出编辑会话。

  1. 调用函数:

直接在 shell 中输入函数名可以查看函数体,输入函数名() 可以调用函数。

修改批处理大小:

db.collection.find()方法是从集合中检索文档的JavaScript方法。

db.collection.find()方法返回一个游标到结果;然而,在mongo shell中,如果返回的游标未使用var关键字分配给变量,则光标自动迭代最多20次,以打印到与查询匹配的前20个文档。 mongo shell将提示键入它再次迭代20次。

可以设置 DBQuery.shellBatchSize 属性来修改默认的 20 篇文档数。

示例代码:

DBQuery.shellBatchSize = 10;

改为10。

MongoShell - 脚本

我们可以在操作MongoDB中的数据或执行管理操作的JavaScript中为mongo shell编写脚本。

打开新链接:

在MongoShell或者 JavaScript文件中,可以使用 Mongo() 构造函数来实例化数据库连接:

new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)

考虑下面的示例,实例化一个到本机默认端口上运行的MongoDB实例的新连接,并且使用 getDB()方法将全局的 db 变量设置为 myDatabase:

conn = new Mongo();
db = conn.getDB("mydb");

如果连接到一个需要读取控制的MongoDB实例,你可以使用 db.auth()方法进行授权。

此外,你可以使用 connect() 方法连接到MongoDB实例。下面的示例 连接到运行在 localhost 非默认端口 27020 上的MongoDB实例,并且设置了全局的 db 变量:

db = connect("localhost:27020/mydb");

交互式 shell 和mongo 脚本的区别:

  1. 要使用db全局变量,请使用getDB()方法或connect()方法。可以将数据库引用分配给非db以外的变量。
  2. 默认情况下,在mongo shell中的写入操作使用写入的{w:1}。如果执行批量操作,请使用Bulk()方法。
  3. 不能在JavaScript文件中使用任何shell 指令,因为它们不是有效的JavaScript,下文附对照表。
  4. 交互模式下,mongo打印包含所有游标内容的操作结果。在脚本中,可以使用JavaScript的 print()函数或返回格式化的JSON的mongo specific printjson()函数。

下表将最常见的mongo shell助手映射到JavaScript等效项:

Shell 指令 JavaScript 操作方式
show dbs , show databases db.adminCommand('listDatabases')
use db = db.getSiblingDB('')
show collections db.getCollectionNames()
show users db.getUsers()
show roles db.getRoles({showBuiltinRoles: true})
show log db.adminCommand({ 'getLog' : '' })
show logs db.adminCommand({ 'getLog' : '*' })
it cursor = db.collection.find()if ( cursor.hasNext() ){ cursor.next();}

--evel选项:

使用--eval选项来将mongo传递给一个JavaScript代码片段。

➜  ~ 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" ]

执行 JavaScript 文件:

MongoShell 可以 指定一个 .js 文件, mongo 将会直接运行JavaScript。

mongo localhost:27017/test myjsfile.js

该操作在连接到localhost 接口 27017 端口 mongod 实例上 test database 的:program:mongo shell 中执行 myjsfile.js 脚本。

可以在MongoShell中使用 load() 函数运行 .js文件,如下所示:

load("demo.js")

该函数导入并运行了 demo.js 文件。

load() 方法可接受相对路径和绝对路径。如果 mongo shell 当前的工作目录位于 /data/db, 而文件demo.js 位于 /data/db/scripts 目录,那么下面两种在 mongo 中的调用将会是同样的效果。

load("scripts/myjstest.js")
load("/data/db/scripts/demo.js")

MongoShell - 数据类型

MongoDB BSON提供了除 JSON之外其它数据类型的支持。 Drivers提供了对这些数据类型在主机语言的本地化支持,MongoShell 也提供了一些帮助类来支持这些数据类型在 mongo JavaScript shell 中的使用。

检查类型:

如果想要确定字段类型,MongoShell提供了 instanceoftypeof 操作符。

instanceof:

instanceof 返回一个布尔值来验证一个值是否为某些类型的实例。

typeof:

typeof 返回一个字段的类型。

数据类型:

日期类型:

MongoShell 提供了多种方法返回日期,要么通过字符串要么通过 Date 对象。

  • Date() 方法返回当前日期为一个字符串。
  • new Date() 构造函数返回一个使用 ISODate() 包装返回的 Date 对象。
  • ISODate() 构造函数返回一个使用 ISODate() 包装返回的 Date 对象。

内部来看, ref:document-bson-type-date 对象被存储为一个表示距离 Unix 纪元(1970年1月1日)毫秒数的64位整数,这就意味着一个可表示的日期范围:从距离过去到将来的29亿年。

返回string:

如果想要返回日期为一个字符串,使用 Date() 方法。

示例代码:

1> var mydate  = Date();  				# 创建日期类型的变量
2> mydate # 查看变量的值
Mon Oct 23 2017 14:30:47 GMT+0800 (CST)
3> typeof(mydate) # 获取查看变量的类型
string
返回Date:

MongoShell使用ISODate帮助程序包装Date类型的对象。但是,对象仍然是Date类型。

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

ObjectId:

MongoShell围绕ObjectId数据类型提供ObjectId()包装器类。

示例代码:

1> new ObjectId();    # 生成一个 ObjectId
ObjectId("59ed998b6d3acf0e7aac525c")

NumberLong:

默认情况下,MongoShell将所有数字视为浮点值(floating-point values)。MongoShell提供NumberLong()包装器来处理64位整数。

示例代码:


11> NumberLong("2090845886852") # NumberLong()包装器接受long作为字符串:
NumberLong("2090845886852")

NumberInt:

NumberInt() 构造函数来显式指定 32位整数。

NumberDecimal:

NumberDecimal()构造函数限制指定 128位 基于十进制的浮点值,能够以精确的精度仿效十进制近似值。 这个功能专为处理 monetary data 的应用而设计,例如金融、税务以及科学计算等。

MongoShell - 其他命令

历史命令:

可以使用向上和向下箭头键检索MongoShell中发出的以前的命令。命令历史存储在~/.dbshell文件中。

示例代码:

cat ~/.dbshell

常用命令:

命令 说明
help 查看帮助
db.help() 查看数据库的操作帮助
db..help() 显示集合的操作文档(集合可以是不存在的)
show dbs 显示当前服务器上所有数据库的列表
use 切换数据库到 <db>(数据库可以是不存在的)
show collections 显示当前数据库的所有集合的列表
show users 显示当前数据库的用户列表
show roles 显示用于当前数据库的用户定义和内置的所有角色的列表。
show profile 显示最近的五个操作命令
show databases 显示所有可用数据库列表。
load() 加载执行JavaScript脚本文件

命令行启动选项:

MongoShell 启动时可以使用一些选项。

选项 说明
--help 显示命令行选项
--nodb 启动MongoShell而不连接到数据库
--shell 与 js 文件一起使用

参考资料:

MongoDB 中文社区: http://www.mongoing.com/docs/mongo.html

MongoDB 官网文档: https://docs.mongodb.com/manual/mongo/

MongoShell引用方法: https://docs.mongodb.com/manual/reference/method/

MongoDB的Shell操作的更多相关文章

  1. MongoDB基本shell操作

    ---------------------MongoDB基本操作--------------------- 1.MongoDB创建数据库     use 数据库名:切换到指定的数据库中,在插入第一个条 ...

  2. 每篇半小时1天入门MongoDB——2.MongoDB环境变量配置和Shell操作

    上一篇:每篇半小时1天入门MongoDB——1.MongoDB介绍和安装 配置环境变量 Win10系统为例 右键单击“此电脑”——属性——高级系统设置——高级——环境变量,添加C:\Program F ...

  3. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  4. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

  5. MongoDB的CRUD操作

    1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...

  6. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

  7. mongodb的常用操作

    对于nosql之前工作中有用到bekerlydb,最近开始了解mongodb,先简单写下mongodb的一些常用操作,当是个总结: 1.mongodb使用数据库(database)和集合(collec ...

  8. MongoDB基本命令行操作

    1. 连接MongoDB: Mongodb://username:password@hostname/dbname 2. 创建数据库: use dbname:如果数据库不存在则创建数据库,否则切换到指 ...

  9. NOSQL -- Mongodb的简单操作与使用(wins)

    NOSQL -- Mongodb的简单操作与使用(wins) 启动mongodb: 1.首先启动服务 dos命令下:net start Mongndb 也可以查询服务,手动开启服务: 完成后: 2.启 ...

随机推荐

  1. 【随记】安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se

    在安装SQL Server 2008 R2 提示创建usersettings/microsoft.sqlserver.configuration.landingpage.properties.se.. ...

  2. Spring boot Security 登陆安全配置

    实现的效果 访问url时,如果未登录时跳转到Login界面,要求用户登陆,如果登陆过返回请求的数据. 效果图 访问数据时,未登录返回login界面 登陆操作 登陆成功进入登出界面 登陆成功后再次访问数 ...

  3. http与https区别,get与post请求区别

    引用:http://blog.csdn.net/m0_38099607/article/details/72864684 HTTP与HTTPS的区别 超文本传输协议HTTP协议被用于在Web浏览器和网 ...

  4. 如将Myeclipse项目改成Eclipse项目

    由于项目需求,需要将原来Myeclipse项目转移到Eclipse中去.搞了半天才搞出来,分享给大家,希望对大家有用. 首先导入一个从Myeclipse导出的项目 然后无法进行tomcat发布. 但是 ...

  5. Android studio: Android Studio 3.5格式化布局代码时错乱

    Android studio 又来搞事情了,更新到3.5版本后,格式化布局文件代码时,布局文件代码竟然会发生变化,意思是不让格式化代码了呗? 垃圾的IDE. 解决办法: “File”-"Se ...

  6. 004 JpaRepository,CrudRepository,PagingAndSortingRepository的区别

    很多程序都在使用,CrudRepository或者PagingAndSortingRepository,但是以前自己的程序使用的是JpaRepository,然后查了一下材料,记录一下. 1.类图 2 ...

  7. jenkins结合supervisor进行python程序发布后的自动重启

    jenkins结合supervisor进行python程序发布后的自动重启 项目背景: 通过jenkins发布kvaccount.chinasoft.com站点的python服务端程序,业务部门同事需 ...

  8. 按钮显示隐藏div、input等

    <script type="text/javascript"> function show() { var value = document.getElementByI ...

  9. Java二维数组的应用

    package com.imooc; public class ArrayDemo5 { public static void main(String[] args) { //二维数组的声明和创建: ...

  10. [译]如何在GitHub仓库创建一个标签tag, 并推送到远程分支?

    问: 我在GitHub上有一个仓库,我需要给他打个tag.我在shell打了tag,但是在Github上没有显示出来.我还要做其他什么么? 我在shell中使用的命令是: git tag 2.0 当我 ...