声明:这是一份查看指令的文档而不是教程,对于一些不多用的操作不录入。
文章目录
- 一、系统操作
- 1.1 启动服务器
- 1.2 连接服务器
- 1.3 安装服务
- 1.4 使用场景
- 二、 基本操作
- 2.1 数据类型
- 2.1.1 浮点数
- 2.1.2 整数
- 2.1.3 字符串
- 2.1.4 正则表达式
- 2.1.5 数组
- 2.1.6 日期
- 2.1.7 内嵌文档
- 2.1.8 ObjectId
- 2.1.9二进制
- 2.1.10 JS代码
- 2.2 数据库操作
- 2.2.1 创建与切换数据库
- 2.2.2 查看数据库
- 2.2.3 删除数据库
- 2.3 集合操作
- 2.3.1 创建集合
- 2.3.2 删除集合
- 2.3.3 查看集合
- 2.4 文档操作
- 2.4.1 插入文档
- 2.4.2 更新文档
- 2.4.3 查看文档
- 2.4.4 删除文档
- 2.5 算数运算
- 三、高级操作
- 3.1 索引
- 3.1.1 创建索引
- 3.1.2 查看索引
- 3.1.3 删除索引
- 3.1.4 全文索引
- 3.1.5 地理空间索引
- 3.2 聚合
- 3.3 查看执行计划
- 3.3.1 explains
- 3.3.2 Profiling
- 3.4 MapReduce
- 3.5 集群(副本集)
- 3.5.1 单台服务器配置副本集
- 3.5.2 多台服务器配置副本集
- 3.5.3 副本集成员添加删除
- 3.5.4 选举仲裁者
- 3.5.5 数据同步方式
- 四、操作符
- 4.1 条件操作符
- 4.2 逻辑操作符
- 4.3 类型操作符
- 4.4 修改器
- 4.4.1 更新操作
- 4.1.2 数组更新操作
- 4.5 算数操作符
- 五 Java Driver
- 5.1 Maven依赖
- 5.2 连接操作
- 5.2.1 建立连接
- 5.2.2 登录操作
- 5.2.3 设置超时
- 5.2 文档操作
- 5.2.1 增加文档
- 5.2.2 修改文档
- 5.2.3 删除文档
- 5.2.4 查看文档
一、系统操作
假设MongoDB路径为:E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10
1.1 启动服务器
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\ --dbpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data
1.2 连接服务器
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\ localhost:port/db -u user -p password
1.3 安装服务
需要管理员权限打开cmd
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\ --bind_ip 0.0.0.0 --logpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data\logs\ --logappend --dbpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data\db --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install
1.4 使用场景
应用特征 | YES / NO |
---|---|
应用不需要事务及复杂 join 支持 | 必须 Yes |
新应用,需求会变,数据模型无法确定,想快速迭代开发 | ? |
应用需要2000-3000以上的读写QPS(更高也可以) | ? |
应用需要TB甚至 PB 级别数据存储 | ? |
应用发展迅速,需要能快速水平扩展 | ? |
应用要求存储的数据不丢失 | ? |
应用需要99.999%高可用 | ? |
应用需要大量的地理位置查询、文本查询 | ? |
如果上述有1个 Yes,可以考虑 MongoDB,2个及以上的 Yes,选择 MongoDB 绝不会后悔。
二、 基本操作
2.1 数据类型
2.1.1 浮点数
shell默认使用64位浮点型数值,如下:
({x:3.1415926})
({x:3})
2.1.2 整数
我们可以使用NumberInt或者NumberLong表示整数:
({x:NumberInt(10)})
({x:NumberLong(12)})
2.1.3 字符串
({x:"hello MongoDB!"})
2.1.4 正则表达式
正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有key为x,value以hello开始的文档且不区分大小写:
({x:/^(hello)(.[a-zA-Z0-9])+/i})
2.1.5 数组
({x:[1,2,3,4,new Date()]})
2.1.6 日期
MongoDB支持Date类型的数据,可以直接new一个Date对象:
({x:new Date()})
2.1.7 内嵌文档
一个文档也可以作为另一个文档的value:
db.sang_collect.insert({name:"三国演义",author:{name:"罗贯中",age:99}});
2.1.8 ObjectId
我们每次插入一条数据系统都会自动帮我们插入一个_id
键,这个键的值不可以重复,它可以是任何类型的,我们也可以手动的插入,默认情况下它的数据类型是ObjectId,由于MongoDB在设计之初就是用作分布式数据库,所以使用ObjectId可以避免不同数据库中_id
的重复(如果使用自增的方式在分布式系统中就会出现重复的_id
的值)。
ObjectId使用12字节的存储空间,每个字节可以存储两个十六进制数字,所以一共可以存储24个十六进制数字组成的字符串,在这24个字符串中,前8位表示时间戳,接下来6位是一个机器码,接下来4位表示进程id,最后6位表示计数器。
2.1.9二进制
二进制数据的存储不能在shell中操作
2.1.10 JS代码
db.sang_collect.insert({x:function f1(a,b){return a+b;}});
2.2 数据库操作
2.2.1 创建与切换数据库
use db:如果数据库不存在,则创建数据库,否则切换到指定数据库。只有在内容插入后才会真正创建
2.2.2 查看数据库
show dbs:显示所有数据的列表。
db :用于查看当前操作的文档(数据库)
2.2.3 删除数据库
():删除当前数据库
2.3 集合操作
2.3.1 创建集合
(“collection”, {name, options):创建capped collections
({convertToCapped:“collection”,size:10}):将一个普通集合转为一个固定集合
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
举例:(“mycoll”, {capped:true,autoIndexId:true,size:100000,max:1000})
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
2.3.2 删除集合
():删除集合
2.3.3 查看集合
show tables:查看全部集合
show collections:查看全部集合
2.4 文档操作
2.4.1 插入文档
({x:10}):往集合中插入文档
2.4.2 更新文档
update:更新文档
(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数 | 说明 |
---|---|
query | update的查询条件,类似sql update查询内where后面的。 |
update | update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的 |
upsert | (可选)这个参数的意思是,如果不存在update的记录,会新建一个文档并插入update的数据,true为插入,默认是false,不插入。 |
multi | (可选)mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 |
writeConcern | (可选)抛出异常的级别。 |
save:传入文档以替换已有文档
(
<document>,
{
writeConcern: <document>
}
)
参数 | 说明 |
---|---|
document | 文档数据。 |
writeConcern | 可选,抛出异常的级别。 |
2.4.3 查看文档
(query, projection)
参数 | 说明 |
---|---|
query | (可选)使用查询操作符指定查询条件 |
projection | (可选)使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 |
举例:({key1:value1, key2:value2}).pretty(),多个条件用逗号隔开
():查看集合内的文档
().pretty():格式化查看集合内的文档
({“title” : {$type : 2}}):获取 “collection” 集合中 title 为 String 的数据
({“title” : {$type : ‘string’}}):获取 “collection” 集合中 title 为 String 的数据
().limit(number):限制 “collection” 集合读取的数据记录条数为number条
().skip(number):跳过 “collection” 集合的前number条数据记录
().sort({KEY:1}):对数据进行排序,1 为升序排列, -1 为降序排列
({},{x:1}):查找文档返回指定数据,参数1表示返回某一个字段,0表示不返回某一个字段,当我们设置只返回x的时候,_id
默认还是返回的,如果不想返回_id
,我们可以设置_id
为0
- 查询NULL值
({<field>:{ i n : [ n u l l ] , in:[null], in:[null],exists:true}}):使用$exists判断该字段是否存在,避免查找到字段不存在的文档
- 查询正则表达式
({x:/^(hello)(.[a-zA-Z0-9])+/i}):查询所有key为x,value以hello开始的文档且不区分大小写
- 查询数组
{<field>:{$all:[<value>,<value>]}}:查询包含以上value的文档
{<field>:[<value>,<value>]}:精确查询存储以上value的文档
{<field>.<num>:<value>}:查询指定下标num值为value的数文档
{<field>:{$size:<num>}}:查询数组长度为num的文档
{},{<field>:{$slice:<num>}}:查询数组中的前num条数据,整数表示数组中前num个元素,负数表示从后往前数num个元素,也可以使<num>=[<num>,<num>]表示范围数据
- 查询嵌套文件
{<field>.<field>:<num>,<field>.<field>:<num>}:可以在查询使忽视文档中字段的顺序
2.4.4 删除文档
(
<query>,
<justOne>
)
2.6版本后:
(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数 | 说明 |
---|---|
query | (可选)删除的文档的条件。 |
justOne | (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 |
writeConcern | (可选)抛出异常的级别。 |
举例:(document,1)
2.5 算数运算
MongoDB支持简单的算数运算
三、高级操作
3.1 索引
3.1.1 创建索引
(keys, options): Key 值为要创建的索引字段,1 升序,-1为降序。如{“title”:1}。options具体参数后面可查。
({:,:}):创建复合索引
({:“text”}):创建全文索引
({:“2d”}):创建2D索引
({:“2dsphere”}):创建2D spere索引s
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
dropDups | Boolean | 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
使用 hint():
可以使用 hint 来强制 MongoDB 使用一个指定的索引。
这种方法某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询(一些字段已经索引了)。
举例:
({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
3.1.2 查看索引
默认情况下,集合中的_id
字段就是索引
():查看指定集合中的索引
():查看指定集合中的索引的大小
3.1.3 删除索引
(“xIndex”):按名称删除索引
():删除所有索引
3.1.4 全文索引
({:“text”}):创建全文索引
({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}}):查询文档,value用空格间隔表示包含下一个单词,用-间隔表示不包含下一个单词。
({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}},{score:{$meta:“textScore”}}):查看查询结果的相似度
3.1.5 地理空间索引
地理空间索引可以分为两类:
1、2d索引,可以用来存储和查找平面上的点。
2、2d sphere索引,可以用来存储和查找球面上的点。
2d索引
({:“2d”}):创建2D索引
({:{ n e a r : [ 90 , 0 ] , near:[90,0], near:[90,0],maxDistance:10}}):使用 n e a r 查 询 某 一 个 点 附 近 的 点 , 默 认 是 100 个 点 。 可 以 通 过 near查询某一个点附近的点,默认是100个点。可以通过 near查询某一个点附近的点,默认是100个点。可以通过maxDistance来设置返回的最远距离:
({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{box:[[0,0],[91,1]]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,box为矩阵
({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{center:[[0,0],90]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,center为圆
({:{KaTeX parse error: Expected '}', got 'EOF' at end of input: geoWithin:{polygon:[[0,0],[100,0],[100,1],[0,1]]}}}):通过 g e o W i t h i n 查 询 某 个 形 状 内 的 点 , geoWithin查询某个形状内的点, geoWithin查询某个形状内的点,polygon为多边形
2d sphere索引
({:“2dsphere”}):创建2D spere索引
({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: within:{geometry:.location}}}):查询与value区域有交集的
({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: near:{geometry:.location}}}):查询在value区域附件的
3.2 聚合
操作:(options)
举例:([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {$sum : 1}}}])
相当于:select by_user, count(*) from mycol group by by_user
聚合表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 计算平均值 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | ([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}]) |
管道操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- m a t c h : 用 于 过 滤 数 据 , 只 输 出 符 合 条 件 的 文 档 。 match:用于过滤数据,只输出符合条件的文档。 match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
3.3 查看执行计划
3.3.1 explains
explain():用在查询语句中,只适用于find()。explain()的用法和sort()、limit()用法差不多,不同的是explain()必须放在最后面。
举例:({:}).explain()
返回结果:
1、queryPlanner:查询计划
2、serverInfo:MongoDB服务的一些信息
其中各个参数的含义为:
参数 | 含义 |
---|---|
plannerVersion | 查询计划版本 |
namespace | 要查询的集合 |
indexFilterSet | 是否使用索引 |
parsedQuery | 查询条件,此处为x=1 |
winningPlan | 最佳执行计划 |
stage | 查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询 |
filter | 过滤条件 |
direction | 搜索方向 |
rejectedPlans | 拒绝的执行计划 |
serverInfo | MongoDB服务器信息 |
添加参数:
除了默认的explain()之外,explain还支持输入参数
举例:explain(“queryPlanner”)
参数类型:
1、queryPlanner:默认参数,与不添加无异
2、executionStats:会返回最佳执行计划的一些统计信息,多了**“executionStats”:{…}**
3、allPlansExecution:获取所有的执行计划
其中executionStats中包含的参数有:
参数 | 含义 |
---|---|
executionSuccess | 是否执行成功 |
nReturned | 返回的结果数 |
executionTimeMillis | 执行耗时 |
totalKeysExamined | 索引扫描次数 |
totalDocsExamined | 文档扫描次数 |
executionStages | 这个分类下描述执行的状态 |
stage | 扫描方式,具体可选值与上文的相同 |
nReturned | 查询结果数量 |
executionTimeMillisEstimate | 预估耗时 |
works | 工作单元数,一个查询会分解成小的工作单元 |
advanced | 优先返回的结果数 |
docsExamined | 文档检查数目,与totalDocsExamined一致 |
3.3.2 Profiling
explains只适用find方法,对于一些聚合查询之类的查询方法就无法统计耗时时间了。可以使用profiling来记录耗时。
开启Profiling的方法:
1、 直接在启动参数里直接进行设置。启动MongoDB时加上–profile=级别
2、在客户端调用(级别)
命令来实时配置。
之后便可以通过()
命令来获取当前的Profile级别。
Profiling
一共分为3个级别:0
- 不开启。1
- 记录慢命令 (默认为>100ms)3
- 记录所有命令
设置慢命令:
1、直接在启动参数里直接进行设置。启动MongoDB时加上–slowms=毫秒数
2、( level , slowms)
():查询profile记录
profile 部分字段解释:
op
:操作类型ns
:被查的集合commond
:命令的内容docsExamined
:扫描文档数nreturned
:返回记录数millis
:耗时时间,单位毫秒ts
:命令执行时间responseLength
:返回内容长度
3.4 MapReduce
var map=function(){emit(this.<field>,this.<value>)}
var reduce=function(key,value){return (value)}
var options={out:"totalPrice"}
(map,reduce,options);
()
emit函数主要用来实现分组,接收两个参数,第一个参数表示分组的字段,第二个参数表示要统计的数据。
reduce来做具体的数据处理操作,接收两个参数,对应emit方法的两个参数,这里使用了Array中的sum函数对price字段进行自加处理。
options中定义了将结果输出的集合。
届时我们将在这个集合中去查询数据,默认情况下,这个集合即使在数据库重启后也会保留,并且保留集合中的数据。
runCommand实现:
也可以利用runCommand命令来执行MapReduce。格式如下:
(
{
mapReduce: <collection>,
map: <function>,
reduce: <function>,
finalize: <function>,
out: <output>,
query: <document>,
sort: <document>,
limit: <number>,
scope: <document>,
jsMode: <boolean>,
verbose: <boolean>,
bypassDocumentValidation: <boolean>,
collation: <document>
}
)
含义如下:
参数 | 含义 |
---|---|
mapReduce | 表示要操作的集合 |
map | map函数 |
reduce | reduce函数 |
finalize | 最终处理函数 |
out | 输出的集合 |
query | 对结果进行过滤 |
sort | 对结果排序 |
limit | 返回的结果数 |
scope | 设置参数值,在这里设置的值在map、reduce、finalize函数中可见 |
jsMode | 是否将map执行的中间数据由javascript对象转换成BSON对象,默认为false |
verbose | 是否显示详细的时间统计信息 |
bypassDocumentValidation | 是否绕过文档验证 |
collation | 其他一些校对 |
3.5 集群(副本集)
3.5.1 单台服务器配置副本集
创建数据存储目录:
mkdir /data/db
启动Mongo Shell:
# —nodb表示启动时不连接任何数据库
mongo --nodb
创建一个副本集:
replicaSet=new ReplSetTest({nodes:3})
在创建的日志中,我们可以看到三个实例的端口号,我这里分别是20000、20001、20002,此时我们的副本集创建好了,但是并未启动,接下来执行如下命令启动三个mongodb实例:
()
再执行如下命令配置复制功能:
()
这样环境基本就配好了,此时当前的shell不要关闭,我们重新打开一个Linux命令窗口,执行如下命令:
mongo 192.168.248.128:20000/collection
表示连接端口为20000的那个实例中的collection数据库,连接成功后,我们可以执行如下命令查看当前实例的身份,如下:
()
返回的数据很多,其中有一条是"ismaster" : true
,表示这是一个主节点,此时我们再分别打开两个Linux窗口,分别执行如下两条命令,进入另外两个节点:
mongo 192.168.248.128:20001/collection
mongo 192.168.248.128:20002/collection
连接成功之后,依然可以通过()
命令来查看备份节点的身份,我们发现此时"ismaster" : false
,表示这是一个备份节点,此时我们可以先做个简单的测试了,此时我在主节点(端口为20000)那个节点上写一个文档,写完之后,我们看看其他副本集成员上是否有我刚才的写的文档的副本,执行命令顺序如下:
主节点写入数据:
db.({x:"hahaha"})
任意一个副本节点,先执行如下命令表示可以从备份节点读取数据:
()
然后再在备份节点中执行如下命令读取数据:
db.()
此时,我们发现数据已经备份成功了。
如果此时我们尝试向备份节点中直接写入文档,会发现写入失败,这里需要注意备份节点中的数据都是备份来的,不可以直接写入,想写入,除非等它的身份转为主节点才可以。
此时,我们尝试通过如下命令关闭主节点:
use admin
()
然后查看两个备份节点的(),发现有一个备份节点自动上位成为了主节点。
最后如果想关闭副本集,可以回到第一个shell命令行中,输入如下命令:
()
3.5.2 多台服务器配置副本集
首先准备好三台装好了MongoDB的服务器,地址分别如下:
192.168.248.128
192.168.248.135
192.168.248.136
修改每台服务器的配置文件,添加replSet=rs,表示副本集的名称,修改后的配置文件内容如下:
dbpath=/opt/mongodb/db
logpath=/opt/mongodb/logs/
port=27017
fork=true
replSet=rs
修改完成之后,分别启动三台服务器上的MongoDB,启动成功之后,连接上任意一台的shell,连接成功之后,先定义配置文件,如下:
config={_id:"rs",members:[{_id:0,host:"192.168.248.128:27017"},{_id:1,host:"192.168.248.135:27017"},{_id:2,host:"192.168.248.136:27017"}]}
id后面跟着的是副本集的名称,也就是我们在中定义的名称,后面三个是副本集的成员,定义好之后,再执行如下命令初始化副本集:
(config)
初始化成功之后,我们就可以通过()来查看副本集的状态,也可以看到每个服务器的角色,部分日志内容如下:
{
"members" : [
{
"_id" : 0,
"name" : "192.168.248.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY"
},
{
"_id" : 1,
"name" : "192.168.248.135:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"syncingTo" : "192.168.248.128:27017"
}
]
}
我们可以看到每台服务器的角色,有primary,也有secondary,secondary上还注明了从哪个服务器上同步数据。
3.5.3 副本集成员添加删除
我们可以利用如下命令删除一个副本集成员:
('ip:port')
上面的命令执行完成后,我们可以通过()命令来查看是否删除成功:
()
也可以通过如下命令来为副本集添加一个成员:
('ip:port')
我们可以在添加节点时指定优先级:
({_id:0,host:'ip:port',priority:2})
也可以为已有的节点设置优先级:
config=()
[0].priority=99
(config)
当然,副本集也是可以更新的,使用reconfig命令即可,如下:
首先定义config,如下:
config={_id:"rs",members:[{_id:0,host:"ip"},{_id:1,host:"ip"}]}
然后执行更新操作:
(config)
我们也可以利用config=()获取原始的config文件,然后进行修改,修改之后再执行 (config),如下:
config=()
[0].host="192.168.248.136"
(config)
3.5.4 选举仲裁者
向副本集中添加仲裁者:
('192.168.248.128:27017')
config=()
[2]={_id:2,host:'ip',arbiterOnly:true}
(config)
3.5.5 数据同步方式
(‘’).stats()
四、操作符
4.1 条件操作符
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 |
{<key>:<value> } |
({"by":""}).pretty() |
where by = '' |
小于 | {<key>:{$lt:<value>}} |
({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
({"likes":{$ne:50}}).pretty() |
where likes != 50 |
4.2 逻辑操作符
操作 | 格式 | 示例 |
---|---|---|
或者 | $or | {$or: [{<key>: <value>}, {<key>:<value>}]} |
A或B包含 | $in | {<key>:{$in:[<value>,<value>]}} |
都不包含 | $nin | {<key>:{$nin:[<value>,<value>]}} |
类型查找 | $type | {<key>:{$type:<value>}} |
取反 | $not | {<key>:{$not:<value>}} |
A和B包含 | $all | {<key>:{$all:[<value>,<value>]}} |
同时比较 | $elemMatch | {<key>:{$elemMatch:{$lt:<num>,$gt:<num>}}} |
4.3 类型操作符
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1 . |
Max key | 127 |
- 类型操作
var newObject = ObjectId():定义唯一主键
():查看文档的时间戳
:ObjectId转字符串输出
():ObjectId转字符串输出
4.4 修改器
4.4.1 更新操作
$set:可以用来修改一个字段的值,如果这个字段不存在,则创建它。
{$set:{<field>:<value>}}
$unset:可以用来删除一个字段。
{$unset:{<field>:<value>}}
i n c : 用 来 增 加 已 有 键 的 值 , 如 果 该 键 不 存 在 就 新 创 建 一 个 。 注 意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意inc只能用来操作数字,不能用来操作null、布尔等。
{$inc:{<field>:<value>}}
$sort:用以排序,-1表示降序,1表示升序。
{$sort:{score:-1}}
4.1.2 数组更新操作
$push:可以向已有数组末尾追加元素,要是不存在就创建一个数组。
{$push:{<field>:<value>}}
$addToSet:可以向已有数组末尾追加其不存在的元素,要是不存在就创建一个数组。
{$addToSet:{<field>:<value>}}
e a c h : 适 用 于 each:适用于 each:适用于addToSet操作符和$push操作符:
{$addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } }
{$push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
$slice:固定数组的长度,假设我固定数组的长度为5,如果数组中的元素不足5个,则全部保留,如果数组中的元素超过5个,则只会保留最新的5个,
{$push:{<field>:{<value>,$slice:5}}}
$pop:可以用来删除数组中的数据,1表示从数组的末尾删除一条数据,-1表示从数组的开头删除一条数据。
{$pop:{<field>:1}}
$pull:按条件删除数组中的某个元素
{$pull:{<field>:"1"}}
4.5 算数操作符
操作 | 格式 | 示例 |
---|---|---|
增加 | $add | {$add: [<value>,<value>...]} |
减去 | $subtract | {$subtract:[<value>,<value>...]} |
相乘 | $multiply | {$multiply:[<value>,<value>...]} |
求商 | $divide | {$divide:[<value>,<value>...]} |
求模 | $mod | {$mod:[<value>,<value>...]} |
五 Java Driver
5.1 Maven依赖
<dependency>
<groupId></groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.5.0</version>
</dependency>
5.2 连接操作
5.2.1 建立连接
首先需要一个MongoClient:
MongoClient client = new MongoClient("127.0.0.1", 27017);
然后通过如下方式获取一个数据库,如果要获取的数据库本身就存在,直接获取到,不存在MongoDB会自动创建:
MongoDatabase database = ("test");
然后通过如下方式获取一个名为collection的集合,这个集合存在的话就直接获取到,不存在的话MongoDB会自动创建出来,如下:
MongoCollection<Document> collection = ("collection");
5.2.2 登录操作
// 登录地址
ServerAddress serverAddress = new ServerAddress("127.0.0.1", 27017);
// MongoCredential是一个凭证,第一个参数为用户名,第二个参数是要在哪个数据库中验证,第三个参数是密码的char数组,
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential mc = MongoCredential.createScramSha1Credential("root","test","123456".toCharArray());
credentialsList.add(mc);
MongoClient client = new MongoClient(serverAddress,credentialsList);
5.2.3 设置超时
// 登录地址
ServerAddress serverAddress = new ServerAddress("192.168.248.128", 27017);
// 身份凭证
List<MongoCredential> credentialsList = new ArrayList<MongoCredential>();
MongoCredential mc = MongoCredential.createScramSha1Credential("rwuser","sang","123".toCharArray());
credentialsList.add(mc);
// 配置参数设置
MongoClientOptions options = MongoClientOptions.builder()
//设置连接超时时间为10s
.connectTimeout(1000*10)
//设置最长等待时间为10s
.maxWaitTime(1000*10)
.build();
// 建立连接
MongoClient client = new MongoClient(serverAddress,credentialsList,options);
5.2 文档操作
5.2.1 增加文档
单条数据:
Document document = new Document();
("name", "三国演义").append("author", "罗贯中");
(document);
多条数据:
List<Document> documentList = new ArrayList<Document>();
Document d1 = new Document();
("name", "三国演义").append("author", "罗贯中");
(d1);
Document d2 = new Document();
("name", "红楼梦").append("author", "曹雪芹");
(d2);
(documentList);
5.2.2 修改文档
修改查到的第一条数据:
(("author", "罗贯中"), new Document("$set", new Document("name", "三国演义123")));
修改查到的所有数据:
(("author", "罗贯中"), new Document("$set", new Document("name", "三国演义456")));
5.2.3 删除文档
删除查到的一条数据:
(("author", "罗贯中"));
删除查到的所有数据:
(("author", "罗贯中"));
5.2.4 查看文档
直接查询所有文档:
FindIterable<Document> documents = ();
for (Document value : documents) {
(value);
}
按照条件查询:
FindIterable<Document> documents = (("author", "罗贯中"));
for (Document value : documents) {
(value);
}