MongoDB指令大全

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

一、系统操作

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

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

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
参数说明
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({<field>:{ 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开始的文档且不区分大小写

  • 查询数组

{<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 删除文档
db.collection.remove(
   <query>,
   <justOne>
)

2.6版本后:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
参数说明
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

ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false
uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的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 : &quot; sum : &quot; 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 : &quot; avg : &quot; 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 : &quot; min : &quot; 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 : &quot; max : &quot; 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 : &quot; push: &quot; 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 : &quot; addToSet : &quot; 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 : &quot; first : &quot; 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 : &quot; last : &quot; 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拒绝的执行计划
serverInfoMongoDB服务器信息

添加参数:

除了默认的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.<field>,this.<value>)}
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: <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表示要操作的集合
mapmap函数
reducereduce函数
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中的类似语句
等于{<key>:<value>}db.col.find({"by":"菜鸟教程"}).pretty()where by = '菜鸟教程'
小于{<key>:{$lt:<value>}}db.col.find({"likes":{$lt:50}}).pretty()where likes < 50
小于或等于{<key>:{$lte:<value>}}db.col.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{<key>:{$gt:<value>}}db.col.find({"likes":{$gt:50}}).pretty()where likes > 50
大于或等于{<key>:{$gte:<value>}}db.col.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{<key>:{$ne:<value>}}db.col.find({"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 类型操作符

类型数字备注
Double1
String2
Object3
Array4
Binary data5
Undefined6已废弃。
Object id7
Boolean8
Date9
Null10
Regular Expression11
JavaScript13
Symbol14
JavaScript (with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255Query with -1.
Max key127
  • 类型操作

var newObject = ObjectId():定义唯一主键

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

newObject.str:ObjectId转字符串输出

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

4.4 修改器

4.4.1 更新操作

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

{$set:{<field>:<value>}}

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

{$unset:{<field>:<value>}}

i n c : 用 来 增 加 已 有 键 的 值 , 如 果 该 键 不 存 在 就 新 创 建 一 个 。 注 意 inc:用来增加已有键的值,如果该键不存在就新创建一个。注意 incinc只能用来操作数字,不能用来操作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:适用于 eachaddToSet操作符和$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>org.mongodb</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 = client.getDatabase("test");

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

MongoCollection<Document> 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<Document> documentList = new ArrayList<Document>();
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<Document> documents = collection.find();
for (Document value : documents) {
	System.out.println(value);
}

按照条件查询:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值