MongoDB指令大全

声明:这是一份查看指令的文档而不是教程,对于一些不多用的操作不录入。

文章目录

    • 一、系统操作
      • 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\mongod.exe --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\mongo.exe
E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongo.exe localhost:port/db -u user -p password

1.3 安装服务

需要管理员权限打开cmd

E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\bin\mongod.exe --bind_ip 0.0.0.0 --logpath E:\JavaWeb\mongodb-win32-x86_64-2008plus-ssl-4.0.10\data\logs\mongodb.log --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位浮点型数值,如下:

db.collection.insert({x:3.1415926})
db.collection.insert({x:3})

2.1.2 整数

我们可以使用NumberInt或者NumberLong表示整数:

db.collection.insert({x:NumberInt(10)})
db.collection.insert({x:NumberLong(12)})

2.1.3 字符串

db.collection.insert({x:"hello MongoDB!"})

2.1.4 正则表达式

正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有key为x,value以hello开始的文档且不区分大小写:

db.collection.find({x:/^(hello)(.[a-zA-Z0-9])+/i})

2.1.5 数组

db.collection.insert({x:[1,2,3,4,new Date()]})

2.1.6 日期

MongoDB支持Date类型的数据,可以直接new一个Date对象:

db.collection.insert({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 删除数据库

db.dropDatabase():删除当前数据库

2.3 集合操作

2.3.1 创建集合

db.createCollection(“collection”, {name, options):创建capped collections

db.runCommand({convertToCapped:“collection”,size:10}):将一个普通集合转为一个固定集合

options 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

举例:db.createCollection(“mycoll”, {capped:true,autoIndexId:true,size:100000,max:1000})

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

2.3.2 删除集合

db.collection.drop():删除集合

2.3.3 查看集合

show tables:查看全部集合

show collections:查看全部集合

2.4 文档操作

2.4.1 插入文档

db.collection.insert({x:10}):往集合中插入文档

2.4.2 更新文档

update:更新文档

db.collection.update(
   ,
   ,
   {
     upsert: ,
     multi: ,
     writeConcern: 
   }
)
参数 说明
query update的查询条件,类似sql update查询内where后面的。
update update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
upsert (可选)这个参数的意思是,如果不存在update的记录,会新建一个文档并插入update的数据,true为插入,默认是false,不插入。
multi (可选)mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern (可选)抛出异常的级别。

save:传入文档以替换已有文档

db.collection.save(
   ,
   {
     writeConcern: 
   }
)
参数 说明
document 文档数据。
writeConcern 可选,抛出异常的级别。

2.4.3 查看文档

db.collection.find(query, projection)
参数 说明
query (可选)使用查询操作符指定查询条件
projection (可选)使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

举例:db.collection.find({key1:value1, key2:value2}).pretty(),多个条件用逗号隔开

db.collection.find():查看集合内的文档

db.collection.find().pretty():格式化查看集合内的文档

db.collection.find({“title” : {$type : 2}}):获取 “collection” 集合中 title 为 String 的数据

db.collection.find({“title” : {$type : ‘string’}}):获取 “collection” 集合中 title 为 String 的数据

db.collection.find().limit(number):限制 “collection” 集合读取的数据记录条数为number条

db.collection.find().skip(number):跳过 “collection” 集合的前number条数据记录

db.collection.find().sort({KEY:1}):对数据进行排序,1 为升序排列, -1 为降序排列

db.collection.find({},{x:1}):查找文档返回指定数据,参数1表示返回某一个字段,0表示不返回某一个字段,当我们设置只返回x的时候,_id默认还是返回的,如果不想返回_id,我们可以设置_id为0

  • 查询NULL值

db.collection.find({:{ i n : [ n u l l ] , in:[null], in:[null],exists:true}}):使用$exists判断该字段是否存在,避免查找到字段不存在的文档

  • 查询正则表达式

db.collection.find({x:/^(hello)(.[a-zA-Z0-9])+/i}):查询所有key为x,value以hello开始的文档且不区分大小写

  • 查询数组

{:{$all:[,]}}:查询包含以上value的文档

{:[,]}:精确查询存储以上value的文档

{.:}:查询指定下标num值为value的数文档

{:{$size:}}:查询数组长度为num的文档

{},{:{$slice:}}:查询数组中的前num条数据,整数表示数组中前num个元素,负数表示从后往前数num个元素,也可以使=[,]表示范围数据

  • 查询嵌套文件

{.:,.:}:可以在查询使忽视文档中字段的顺序

2.4.4 删除文档

db.collection.remove(
   ,
   
)

2.6版本后:

db.collection.remove(
   ,
   {
     justOne: ,
     writeConcern: 
   }
)
参数 说明
query (可选)删除的文档的条件。
justOne (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
writeConcern (可选)抛出异常的级别。

举例:db.collection.remove(document,1)

2.5 算数运算

MongoDB支持简单的算数运算

三、高级操作

3.1 索引

3.1.1 创建索引

db.collection.createIndex(keys, options): Key 值为要创建的索引字段,1 升序,-1为降序。如{“title”:1}。options具体参数后面可查。

db.collection.ensureIndex({:,:}):创建复合索引

db.collection.ensureIndex({:“text”}):创建全文索引

db.collection.ensureIndex({:“2d”}):创建2D索引

db.collection.ensureIndex({:“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 并且执行一个多字段的查询(一些字段已经索引了)。

举例:

db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

3.1.2 查看索引

默认情况下,集合中的_id字段就是索引

db.collection.getIndexes():查看指定集合中的索引

db.collection.totalIndexSize():查看指定集合中的索引的大小

3.1.3 删除索引

db.collection.dropIndex(“xIndex”):按名称删除索引

db.collection.dropIndexes():删除所有索引

3.1.4 全文索引

db.collection.ensureIndex({:“text”}):创建全文索引

db.collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}}):查询文档,value用空格间隔表示包含下一个单词,用-间隔表示不包含下一个单词。

db.collection.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: text:{search:}},{score:{$meta:“textScore”}}):查看查询结果的相似度

3.1.5 地理空间索引

地理空间索引可以分为两类:

1、2d索引,可以用来存储和查找平面上的点。

2、2d sphere索引,可以用来存储和查找球面上的点。

2d索引

db.collection.ensureIndex({:“2d”}):创建2D索引

db.collection.find({:{ n e a r : [ 90 , 0 ] , near:[90,0], near:[90,0],maxDistance:10}}):使用 n e a r 查 询 某 一 个 点 附 近 的 点 , 默 认 是 100 个 点 。 可 以 通 过 near查询某一个点附近的点,默认是100个点。可以通过 near100maxDistance来设置返回的最远距离:

db.collection.find({:{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查询某个形状内的点, geoWithinbox为矩阵

db.collection.find({:{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查询某个形状内的点, geoWithincenter为圆

db.collection.find({:{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查询某个形状内的点, geoWithinpolygon为多边形

2d sphere索引

db.collection.ensureIndex({:“2dsphere”}):创建2D spere索引

db.collection.find({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: within:{geometry:.location}}}):查询与value区域有交集的

db.collection.find({location:{KaTeX parse error: Expected '}', got 'EOF' at end of input: near:{geometry:.location}}}):查询在value区域附件的

3.2 聚合

操作:db.collection.aggregate(options)

举例:db.mycol.aggregate([{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 计算总和。 db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}])
$push 在结果文档中插入值到一个数组中。 db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}])
$addToSet 在结果文档中插入值到一个数组中,但不创建副本。 db.mycol.aggregate([{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 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{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 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{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:用于过滤数据,只输出符合条件的文档。 matchmatch使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

3.3 查看执行计划

3.3.1 explains

explain():用在查询语句中,只适用于find()。explain()的用法和sort()、limit()用法差不多,不同的是explain()必须放在最后面。

举例:db.collection.find({:}).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、在客户端调用db.setProfilingLevel(级别)命令来实时配置。

之后便可以通过db.getProfilingLevel()命令来获取当前的Profile级别。

Profiling一共分为3个级别:
0 - 不开启。
1 - 记录慢命令 (默认为>100ms)
3 - 记录所有命令

设置慢命令:

1、直接在启动参数里直接进行设置。启动MongoDB时加上–slowms=毫秒数

2、db.setProfilingLevel( level , slowms)

db.system.profile.find():查询profile记录

profile 部分字段解释:

op:操作类型
ns:被查的集合
commond:命令的内容
docsExamined:扫描文档数
nreturned:返回记录数
millis:耗时时间,单位毫秒
ts:命令执行时间
responseLength:返回内容长度

3.4 MapReduce

var map=function(){emit(this.,this.)}
var reduce=function(key,value){return Array.sum(value)}
var options={out:"totalPrice"}
db.collection.mapReduce(map,reduce,options);
db.totalPrice.find()

emit函数主要用来实现分组,接收两个参数,第一个参数表示分组的字段,第二个参数表示要统计的数据。

reduce来做具体的数据处理操作,接收两个参数,对应emit方法的两个参数,这里使用了Array中的sum函数对price字段进行自加处理。

options中定义了将结果输出的集合。

届时我们将在这个集合中去查询数据,默认情况下,这个集合即使在数据库重启后也会保留,并且保留集合中的数据。

runCommand实现

也可以利用runCommand命令来执行MapReduce。格式如下:

db.runCommand(
               {
                 mapReduce: ,
                 map: ,
                 reduce: ,
                 finalize: ,
                 out: ,
                 query: ,
                 sort: ,
                 limit: ,
                 scope: ,
                 jsMode: ,
                 verbose: ,
                 bypassDocumentValidation: ,
                 collation: 
               }
             )

含义如下:

参数 含义
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实例:

replicaSet.startSet()

再执行如下命令配置复制功能:

replicaSet.initiate()

这样环境基本就配好了,此时当前的shell不要关闭,我们重新打开一个Linux命令窗口,执行如下命令:

mongo 192.168.248.128:20000/collection

表示连接端口为20000的那个实例中的collection数据库,连接成功后,我们可以执行如下命令查看当前实例的身份,如下:

db.isMaster()

返回的数据很多,其中有一条是"ismaster" : true,表示这是一个主节点,此时我们再分别打开两个Linux窗口,分别执行如下两条命令,进入另外两个节点:

mongo 192.168.248.128:20001/collection
mongo 192.168.248.128:20002/collection

连接成功之后,依然可以通过db.isMaster()命令来查看备份节点的身份,我们发现此时"ismaster" : false,表示这是一个备份节点,此时我们可以先做个简单的测试了,此时我在主节点(端口为20000)那个节点上写一个文档,写完之后,我们看看其他副本集成员上是否有我刚才的写的文档的副本,执行命令顺序如下:

主节点写入数据:

db.collect1.insert({x:"hahaha"})

任意一个副本节点,先执行如下命令表示可以从备份节点读取数据:

db.setSlaveOk()

然后再在备份节点中执行如下命令读取数据:

db.collect1.find()

此时,我们发现数据已经备份成功了。
如果此时我们尝试向备份节点中直接写入文档,会发现写入失败,这里需要注意备份节点中的数据都是备份来的,不可以直接写入,想写入,除非等它的身份转为主节点才可以。

此时,我们尝试通过如下命令关闭主节点:

use admin
db.shutdownServer()

然后查看两个备份节点的db.isMaster(),发现有一个备份节点自动上位成为了主节点。

最后如果想关闭副本集,可以回到第一个shell命令行中,输入如下命令:

replicaSet.stopSet()

3.5.2 多台服务器配置副本集

首先准备好三台装好了MongoDB的服务器,地址分别如下:

192.168.248.128
192.168.248.135
192.168.248.136

修改每台服务器的配置文件mongodb.conf,添加replSet=rs,表示副本集的名称,修改后的配置文件内容如下:

dbpath=/opt/mongodb/db
logpath=/opt/mongodb/logs/mongodb.log
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后面跟着的是副本集的名称,也就是我们在mongodb.conf中定义的名称,后面三个是副本集的成员,定义好之后,再执行如下命令初始化副本集:

rs.initiate(config)

初始化成功之后,我们就可以通过rs.status()来查看副本集的状态,也可以看到每个服务器的角色,部分日志内容如下:

{
    "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 副本集成员添加删除

我们可以利用如下命令删除一个副本集成员:

rs.remove('ip:port')

上面的命令执行完成后,我们可以通过rs.status()命令来查看是否删除成功:

rs.status()

也可以通过如下命令来为副本集添加一个成员:

rs.add('ip:port')

我们可以在添加节点时指定优先级:

rs.add({_id:0,host:'ip:port',priority:2})

也可以为已有的节点设置优先级:

config=rs.config()
config.members[0].priority=99
rs.reconfig(config)

当然,副本集也是可以更新的,使用reconfig命令即可,如下:

首先定义config,如下:

config={_id:"rs",members:[{_id:0,host:"ip"},{_id:1,host:"ip"}]}

然后执行更新操作:

rs.reconfig(config)

我们也可以利用config=rs.config()获取原始的config文件,然后进行修改,修改之后再执行 rs.reconfig(config),如下:

config=rs.config()
config.members[0].host="192.168.248.136"
rs.reconfig(config)

3.5.4 选举仲裁者

向副本集中添加仲裁者:

rs.addArb('192.168.248.128:27017')
config=rs.config()
config.members[2]={_id:2,host:'ip',arbiterOnly:true}
rs.reconfig(config)

3.5.5 数据同步方式

db.getCollection(‘oplog.rs’).stats()

四、操作符

4.1 条件操作符

操作 格式 范例 RDBMS中的类似语句
等于 {:} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {:{$lt:}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

4.2 逻辑操作符

操作 格式 示例
或者 $or {$or: [{: }, {:}]}
A或B包含 $in {:{$in:[,]}}
都不包含 $nin {:{$nin:[,]}}
类型查找 $type {:{$type:}}
取反 $not {:{$not:}}
A和B包含 $all {:{$all:[,]}}
同时比较 $elemMatch {:{$elemMatch:{$lt:,$gt:}}}

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():定义唯一主键

newObject.getTimestamp():查看文档的时间戳

newObject.str:ObjectId转字符串输出

newObject.toString():ObjectId转字符串输出

4.4 修改器

4.4.1 更新操作

$set:可以用来修改一个字段的值,如果这个字段不存在,则创建它。

{$set:{:}}

$unset:可以用来删除一个字段。

{$unset:{:}}

i n c : 用 来 增 加 已 有 键 的 值 , 如 果 该 键 不 存 在 就 新 创 建 一 个 。 注 意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意 incinc只能用来操作数字,不能用来操作null、布尔等。

{$inc:{:}}

$sort:用以排序,-1表示降序,1表示升序。

{$sort:{score:-1}}

4.1.2 数组更新操作

$push:可以向已有数组末尾追加元素,要是不存在就创建一个数组。

{$push:{:}}

$addToSet:可以向已有数组末尾追加其不存在的元素,要是不存在就创建一个数组。

{$addToSet:{:}}

e a c h : 适 用 于 each:适用于 eachaddToSet操作符和$push操作符:

{$addToSet: { : { $each: [ , ... ] } } }

{$push: { : { $each: [ , ... ] } } }

$slice:固定数组的长度,假设我固定数组的长度为5,如果数组中的元素不足5个,则全部保留,如果数组中的元素超过5个,则只会保留最新的5个,

{$push:{:{,$slice:5}}}

$pop:可以用来删除数组中的数据,1表示从数组的末尾删除一条数据,-1表示从数组的开头删除一条数据。

{$pop:{:1}}

$pull:按条件删除数组中的某个元素

{$pull:{:"1"}}

4.5 算数操作符

操作 格式 示例
增加 $add {$add: [,...]}
减去 $subtract {$subtract:[,...]}
相乘 $multiply {$multiply:[,...]}
求商 $divide {$divide:[,...]}
求模 $mod {$mod:[,...]}

五 Java Driver

5.1 Maven依赖


    org.mongodb
    mongodb-driver
    3.5.0

5.2 连接操作

5.2.1 建立连接

首先需要一个MongoClient:

MongoClient client = new MongoClient("127.0.0.1", 27017);

然后通过如下方式获取一个数据库,如果要获取的数据库本身就存在,直接获取到,不存在MongoDB会自动创建:

MongoDatabase database = client.getDatabase("test");

然后通过如下方式获取一个名为collection的集合,这个集合存在的话就直接获取到,不存在的话MongoDB会自动创建出来,如下:

MongoCollection collection = sang.getCollection("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();
document.append("name", "三国演义").append("author", "罗贯中");
collection.insertOne(document);

多条数据:

List documentList = new ArrayList();
Document d1 = new Document();
d1.append("name", "三国演义").append("author", "罗贯中");
documentList.add(d1);
Document d2 = new Document();
d2.append("name", "红楼梦").append("author", "曹雪芹");
documentList.add(d2);
collection.insertMany(documentList);

5.2.2 修改文档

修改查到的第一条数据:

collection.updateOne(Filters.eq("author", "罗贯中"), new Document("$set", new Document("name", "三国演义123")));

修改查到的所有数据:

collection.updateMany(Filters.eq("author", "罗贯中"), new Document("$set", new Document("name", "三国演义456")));

5.2.3 删除文档

删除查到的一条数据:

c.deleteOne(Filters.eq("author", "罗贯中"));

删除查到的所有数据:

c.deleteMany(Filters.eq("author", "罗贯中"));

5.2.4 查看文档

直接查询所有文档:

FindIterable documents = collection.find();
for (Document value : documents) {
	System.out.println(value);
}

按照条件查询:

FindIterable documents = collection.find(Filters.eq("author", "罗贯中"));
for (Document value : documents) {
	System.out.println(value);
}

你可能感兴趣的:(其他)