MongoDB基本操作命令⼀
安装完成后创建数据⽬录
MongoDB 将数据⽬录存储在 db ⽬录下。但是这个数据⽬录不会主动创建,我们在安装完成后需要创建它。请注意,数据⽬录应该放在根⽬录下 (如: C:\ 或者 D:\ 等 )。
在 D 盘下创建⽬录:d:\mongoDBdata\db
配置MongoDB服务
创建数据库和⽇志⽂件⽬录:
d:\mongoDBdata\db
d:\mongoDBdata\log\mongod.log
配置⽂件(⼀般⾼版本的会⾃动创建,没有就⾃⼰创建) mongod.cfg
指定 systemLog.path 和 storage.dbPath。具体配置内容如下。
# Where and how to store data.
storage:
dbPath: D:\mongoDBdata\db
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\mongoDBdata\log\mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
将MongoDB服务器作为Windows服务运⾏
像上⾯那样启动mongodb,发现没办法输⼊命令⾏了,这是可以采⽤打开多个窗⼝来连接,但这样就太⿇烦了,解决办法就是将MongoDB服务器作为Windows服务运⾏。
启动MongoDB服务: net start MongoDB (启动之后在服务中可看到状态为正在运⾏)
关闭MongoDB服务: net stop MongoDB
移除MongoDB服务: D:\mongoDB\ --remove
由于我们并没有指定mongodb服务的端⼝号,所以它启动在默认的27017窗⼝。
It looks like you are trying to access MongoDB over HTTP on the native driver port.
MongoDB 后台管理 Shell
如果你需要进⼊MongoDB后台管理,你需要先打开mongodb安装⽬录的下的bin⽬录,然后执⾏⽂件,
MongoDB Shell是 MongoDB⾃带的交互式Javascript shell,⽤来对MongoDB进⾏操作和管理的交互式环境。
然后可以执⾏⼀些操作:
第⼀个命令将数字 10 插⼊到 runoob 集合的 x 字段中:db.runoob.insert({x:10})
查:db.runoob.find().pretty() //输出格式美化
MongoDB的⼀些命令:
显⽰所有数据库列表: show dbs
显⽰当前数据库对象或集合: db
如果数据库不存在,则创建数据库,否则切换到指定数据库 : use database_name
删除数据库的语法: db.dropDatabase() 删除当前数据库,默认为 test,你可以使⽤ db 命令查看当前数据库名
查看已有集合: show tables/collections
创建集合: db.createCollection(name, options)
创建带参数的固定集合:(整个集合空间⼤⼩ 6142800 B, ⽂档最⼤个数为 10000 个)
db.createCollection('collectionName',{capped: true,autoIndexId: true,size:6142800,max: 10000})
集合删除语法格式如下: db.collectionName.drop()
在 MongoDB 中,你不需要创建集合。当你插⼊⼀些⽂档时,MongoDB 会⾃动创建集合:
db.mycols.insert({'name' : '测试插⼊时⾃动创建集合'})
插⼊⽂档:
或
db.collectionName.save(document)
save():如果 _id 主键存在则更新数据,如果不存在就插⼊数据。该⽅法新版本中已废弃,可以使⽤ db.collection.insertOne() 或 placeOne() 来代替。 insert(): 若插⼊的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提⽰主键重复,不保存当前数据。
db.collectionName.insertOne(): 向指定集合中插⼊⼀条⽂档数据
db.collectionName.insertMany(): 向指定集合中插⼊多条⽂档数据
MongoDB 使⽤和⽅法来更新集合中的⽂档:
update() ⽅法:⽤于更新已存在的⽂档
db.collectionName.update(
<query>, //update的查询条件
<update>, //update的对象和⼀些更新的操作符等
{
upsert: <boolean>, //可选参数,如果不存在 update的记录,是否插⼊,默认是false,不插⼊
multi: <boolean>, // 可选参数,默认false,只更新到的第⼀条记录,若为 true,把按条件查出来的多条记录全部更新
writeConcern: <document> // 可选,抛出异常的级别
}
)
例⼦:db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save()⽅法: save() ⽅法通过传⼊的⽂档来替换已有⽂档,_id 主键存在就更新,不存在就插⼊
db.collectionName.save(
<document>, //⽂档数据
{
witeConcern: <document> // 可选参数,抛出异常的级别
}
)
remove() 删除⽂档(移除集合中的数据):
ve(
<query>, // 可选,删除的⽂档的条件
{
justOne : <boolean>, // 可选,如果设为 true 或 1,则只删除⼀个⽂档,如果不设置该参数,或使⽤默认值 false, 则删除所有匹配条件的⽂档。
writeConcern: <document> // 可选,抛出异常的级别
}
)
注意:只想删除第⼀条到的记录可以设置 justOne 为 1
想删除所有数据, 使⽤justOne 默认值为false
删除集合下的所有数据: ve({})
remove() ⽅法已经过时了,现在官⽅推荐使⽤ deleteOne() 和 deleteMany() ⽅法。
如删除集合下全部⽂档: db.collectionName.deleteMany({})
删除 status 等于 A 的全部⽂档: db.collectionName.deleteMany({ status : "A" })
删除 status 等于 D 的⼀个⽂档: db.collectionName.deleteOne( { status: "D" } )
查询⽂档:主要使⽤ find()⽅法,以⾮结构化的⽅式来显⽰所有⽂档。
db.collectionName.find(query,projection); // query 可选参数,使⽤查询操作符查询条件 projectio
n 可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值,只需省略该参数即可(默认省略)。
需要以易读的⽅式来读取数据,可以使⽤ pretty() ⽅法: db.collectionName.find().pretty()
findOne() ⽅法,只返回⼀个⽂档。
条件语句查询:(条件操作符)
db.col.find({"num":50}).pretty() // num = 50
db.col.find({"num":{$lt:50}}).pretty() // num < 50
db.col.find({"num":{$lte:50}}).pretty() // num <= 50
db.col.find({"num":{$gt:50}}).pretty() // num > 50
db.col.find({"num":{$gt:50}}).pretty() // num > 50
db.col.find({"num":{$gte:50}}).pretty() // num >= 50
db.col.find({"num":{$ne:50}}).pretty() // num != 50
db.col.find({"num":{$lt:200,$gt:100}}) // 100 < num < 200
MongoDB and 条件:
db.col.find({key1:value, key2:value2}).pretty()
MongoDB or 条件:
db.col.find(
{
$or : [
{key1 : value1}, {key2 : value2}
]
}
).pretty()
MongoDB and 和 or 联合使⽤:类似 SQL where key1 > value1 and (key2 = value2 or key3 = value3)
db.col.find({key1 : {$gt : value1}, $or[{key2 : value2}, {key3 : value3}]).pretty()
MongoDB $type 条件操作符:( $type 操作符是基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。)
例如,想过去 col 集合中 title 为 String 的数据: (2 代表字符串类型 strig) 参考:
db.col.find({"title" : {$type : 2}}) 或者 db.col.find({"title" : {$type : "string"}})
MongoDB Limit 于 Skip ⽅法:
Limit() ⽅法:如果你需要在 MongoDB 中读取指定数量的数据记录,可以使⽤ MongoDB 的 Limit ⽅法,limit() ⽅法接受⼀个数字参数,该参数指定从 MongoDB 中读取的记录条数
db.collectionName.find().limit(number)
Skip() ⽅法:使⽤ skip() ⽅法来跳过指定数量的数据,skip ⽅法同样接受⼀个数字参数作为跳过的记录条数
db.collectionName.find().limit(1).skip(1) //限制显⽰⼀条,然后跳过第⼀条,显⽰第⼆条
db.collectionName.find().skip(1) //跳过第⼀条,显⽰后⾯的数据
MongoDB 排序:
sort() ⽅法:可以通过参数指定排序的字段,并使⽤ 1 和 -1 来指定排序的⽅式,其中 1 为升序排列,⽽ -1 是⽤于降序排列。
db.collectionName.find().sort({key:1}) 例⼦: db.collectionName.find({}, {"title": 1,"_id":0}).sort({"likes": -1})
skip(), limilt(), sort()三个放在⼀起执⾏的时候,执⾏的顺序是先 sort(), 然后是 skip(),最后是显⽰的 limit()。
MongoDB 索引:(每个索引占据⼀定的存储空间,在进⾏插⼊,更新和删除操作时也需要对索引进⾏操作。所以,如果你很少对集合进⾏读取操作,建议不使⽤索引。)
(由于索引是存储在内存(RAM)中,你应该确保该索引的⼤⼩不超过内存的限制。如果索引的⼤⼩⼤于内存的限制,MongoDB会删除⼀些索引,这将导致性能下降)
最⼤范围:
1.集合中索引不能超过64个。
2.索引名的长度不能超过125个字符
3. ⼀个复合索引最多可以有31个字段
索引是特殊的数据结构,索引存储在⼀个易于遍历读取的数据集合中,索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构
createIndex() ⽅法来创建索引:
ateIndex(keys, options); // Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可
如: ateIndex({"title" : 1})
createIndex() ⽅法中你也可以设置使⽤多个字段创建索引(关系型数据库中称作复合索引)。
如: ateIndex({"title" : 1, "description": -1})
在后台创建索引: ateIndex({open : 1, close : 1}, {background : true})
查看集合索引: Indexes()
查看集合索引⼤⼩:alIndexSize()
删除集合所有索引:db.collectionName.dropIndexes()
删除集合指定索引:db.collectionName.dropIndex("索引名称")
注意在 3.0.0 版本前创建索引⽅法为 sureIndex(),之后的版本使⽤了 ateIndex() ⽅法,ensureIndex() 还能⽤,但只是createIndex() 的别名。
MongoDB 聚合:(MongoDB 中聚合(aggregate)主要⽤于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果)
aggregate() MongoDB中的聚合⽅法。
db.collectionName.aggregate(AGGREATE_OPERATION)
例⼦: db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum:1}}}]) //通过字段
by 对数据进⾏分组,并计算 by 字段相同值的总和
db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) //计算平均值
db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) //获取集合⽂档对应值得最⼩值
db.col.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) //获取集合⽂档对应值得最⼤值
db.col.aggregate([{$group : {_id : "$by_user", url : {$push : "$url"}}}]) //在结果⽂档中插⼊值到⼀个数组中
db.col.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) //在结果⽂档中插⼊值到⼀个数组中,但不创建副本
db.col.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) //根据资源⽂档的排序获取第⼀个⽂档数据
db.col.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) //根据资源⽂档的排序获取最后⼀个⽂档数据
管道: MongoDB 的聚合管道将 MongoDB ⽂档在⼀个管道处理完毕后将结果传递给下⼀个管道处理
聚合框架中常⽤的⼏个操作:
$project:修改输⼊⽂档的结构。可以⽤来重命名、增加或删除域,也可以⽤于创建计算结果以及嵌套⽂档。
$match:⽤于过滤数据,只输出符合条件的⽂档。$match使⽤MongoDB的标准查询操作。
$limit:⽤来限制MongoDB聚合管道返回的⽂档数。
$skip:在聚合管道中跳过指定数量的⽂档,并返回余下的⽂档。
$unwind:将⽂档中的某⼀个数组类型字段拆分成多条,每条包含数组中的⼀个值。
$group:将集合中的⽂档分组,可⽤于统计结果。
$sort:将输⼊⽂档排序后输出。
$geoNear:输出接近某⼀地理位置的有序⽂档。
MapReduce 命令:( Map-Reduce 是⼀种计算模型,简单的说就是将⼤批量的⼯作(数据)分解(MAP)执⾏,然后再将结果合并成最终结果(REDUCE))
MongoDB提供的 Map-Reduce ⾮常灵活,对于⼤规模数据分析也相当实⽤
db.col.mapReduce(
function(){ emit(key, value)} // map 函数 (映射函数 (⽣成键值对序列,作为 reduce 函数参数)。)
function(key,values){ return reduceFunction } // reduce 函数 (reduce 统计函数,reduce函数的任务就是将 key-values 变成 key-value ,也就是把 values 数组变成⼀个单⼀的值 value ) {
out : collection, // out 统计结果存放集合 (不指定则使⽤临时集合,在客户端断开后⾃动删除)
query : document, // query ⼀个筛选条件,只有满⾜条件的⽂档才会调⽤ map 函数。(query。limit,sort可以随意组合)
sort : document, // sort 和 limit 结合的 sort 排序参数(也是在发往 map 函数前给⽂档排序),可以优化分组机制
limit : number // limit 发往 map 函数的⽂档数量的上限(要是没有limit,单独使⽤sort的⽤处不⼤)
}
)
// 使⽤ MapReduce 要实现两个函数 Map 函数和 Reduce 函数,Map 函数调⽤ emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进⾏处理
// Map 函数必须调⽤ emit(key, value) 返回键值对
MongoDB 复制(副本集):( MongoDB 复制是将数据同步在多个服务器的过程,复制还允许您从硬件故障和服务中断中恢复数据)
MongoDB 分⽚:另⼀种集,就是分⽚技术,可以满⾜ MongoDB 数据量⼤量增长的需求。
当 MongoDB 存储海量的数据时,⼀台机器可能不⾜以存储数据,也可能不⾜以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据
分⽚实列
分⽚结构端⼝分布:
Shard Server 1: 27020
Shard Server 2: 27021
Shard Server 3: 27022
Shard Server 1: 27023
Config Server 4: 27100
Route Process 1: 40000
步骤⼀:启动 Shard Server
1. 在 D盘⽂件下创建⽬录( -p 参数表⽰创建⼦⽬录)
mkdir -p /www/mongoDB/shard/s0
mkdir -p /www/mongoDB/shard/s1
mkdir -p /www/mongoDB/shard/s2
mkdir -p /www/mongoDB/shard/s3
然后命令⾏执⾏:进⼊到 mongodb 安装⽬录: cd: D:\mongoDB\bin 执⾏命令:
mongod --port 27020 --dbpath=D:\mongoDBdata\shard\s0 --logpath=D:\mongoDBdata\shard\log\s0.log --logappend
mongod --port 27021 --dbpath=D:\mongoDBdata\shard\s1 --logpath=D:\mongoDBdata\shard\log\s1.log --logappend
mongod --port 27022 --dbpath=D:\mongoDBdata\shard\s2 --logpath=D:\mongoDBdata\shard\log\s2.log --logappend
sort命令排序
mongod --port 27023 --dbpath=D:\mongoDBdata\shard\s3 --logpath=D:\mongoDBdata\shard\log\s3.log --logappend
步骤⼆:启动 config Server
mkdir -p /www/mongoDB/shard/config
mongod --port 27100 --dbpath=D:\mongoDBdata\shard\config --logpath=D:\mongoDBdata\shard\log\config.log --logappend
步骤三:启动 Route Process
mongos --port 40000 --configdb localhost:27100 --fork --logpath=D:\mongoDBdata\shard\log\route.log --chunkSize 500
( mongos 启动参数中,chunkSize 这⼀项是⽤来指定 chunk 的⼤⼩的,单位是MB,默认⼤⼩为200MB.)
步骤三出现的问题:
原因:
使⽤的 MongoDB 3.4.10 版,这个版本在之前的版本上有做调整,要求configs服务器是副本集模式。3.2和3.2以下都不做强制要求的。
解决⽅法:
1.configs服务器配置成副本集模式
2.把MongoDB换成
3.4以下版本
步骤四:配置 Sharding
使⽤ MongoDB Shell 登录到 mongos,添加 Shard 节点。
mongo admin --port 40000
db.runCommand({ addshard:"localhost:27020" })
db.runCommand({ addshard:"localhost:27021" })
db.runCommand({ addshard:"localhost:27022" })
db.runCommand({ addshard:"localhost:270203" })
db.runCommand({ enablesharding:"test" }) //设置分⽚存储的数据库
db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
步骤五:
程序代码内⽆需太⼤更改,直接按照连接普通的mongo数据库那样,将数据库连接接⼊接⼝40000
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论