索引管理

  1. 查看索引:db.COLLECTION_NAME.getIndexes()
  2. 查看索引大小:db.COLLECTION_NAME.totalIndexSize()
  3. 查看数据库中所有索引:db.system.indexes.find()
  4. 删除索引:db.COLLECTION_NAME.dropIndex("INDEX-NAME")
  5. 删除全部索引:db.COLLECTION_NAME.dropIndexes()
  6. 重建索引:db.COLLECTION_NAME.reIndex()
  7. 创建索引:db.COLLECTION_NAME.ensureIndex(keys[,options])

创建索引参数

keys,要建立索引的参数列表。如:{KEY:1},其中key表示字段名,1表示升序排序,也可使用使用数字-1降序。
options,可选参数,表示建立索引的设置。可选值如下:
background,Boolean,在后台建立索引,以便建立索引时不阻止其他数据库活动。默认值 false。
unique,Boolean,创建唯一索引。默认值 false。
name,String,指定索引的名称。如果未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。
dropDups,Boolean,创建唯一索引时,如果出现重复删除后续出现的相同索引,只保留第一个。
sparse,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。
v,index version,索引的版本号。
weights,document,索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。

数据操作

//批量更新
db.getCollection('col').update({},{"$set":{"status":0}},{'multi':true})
//删除指定字段
db.getCollection('col').update({},{$unset:{"_class":""}},false,true)
//创建索引
db.values.createIndex({open: 1, close: 1}, {background: true})
// $inc 数据递增,$unset 删除字段 $set 新增字段 $rename 修改字段名
db.getCollection('demo').update({"_id": ObjectId("60bf96092097484ee29689ab")}, {$inc: {f: 10},$unset:{e:""},$set:{new_field:""},$rename : {"c" : "rename_field"}})

使用URI连接

mongodb://userName:password@host:port/db?authSource=admin
# python
"mongodb://{username}:{password}@{host}:{port}/{db}?authSource=${db}".format(username="dba",password="mongo",host="192.168.1.1",port=27017,db="dbname")

# 参数
minPoolSize:连接池中最小连接存活数,默认为0,启动时,初始化的最小连接数
maxPoolSize:连接池最大数,默认值为100
maxIdleTimeMS:一个连接在池中的最大空闲时间,如果空闲超过此时间,则会被移除连接池,同时关闭连接,释放连接资源;单位为毫秒。默认为0,永不释放。
maxLifeTimeMS:最大有效存活时间,默认为0,永远存活
waitQueueTimeoutMS:等待获取连接最大超时时间,默认为0,永不超时
connectTimeoutMS:连接超时时间,单位为毫秒,默认为0,永不超时
socketTimeoutMS:发送或者接收socket的超时时间,单位为毫秒,默认为0,永不超时

监控

db.stats(1024);#Kb显示
db.stats(1024*1024);#MB显示

mongostat -h 127.0.0.1 -u username -p password --authenticationDatabase admin

两个表数据同步

# 方法一
db.from_doc.find().forEach(function(doc) {
  db.to_doc.insert(doc);
});
# 方法二
mongoexport -h [ip_address] -d [database] -c [collection] > source.json
mongoimport -h [ip_address] -d [database] -c [target] source.json
# 方法三:3.2之后
mongoexport -h [ip_address] -d [database] -c [collection] | mongoimport -h [ip_address] -d [database] -c [target]

查询所有数据库

show dbs;

切换/创建数据库

use yourDB;

删除当前使用数据库

db.dropDatabase();

mongodump

mongodump -d test -o data/backup

参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
--archive参数,导出的数据压缩为一个文件
-q:指明导出数据的过滤条件
--authenticationDatabase
--excludeCollection=collection1
--gzip

//还原无法指定db
mongodump -h 127.0.0.1 --port 27017 -u root -p password --authenticationDatabase=admin --db dbname --gzip --archive=dump_dbname.tar.gz

mongorestore

恢复mongodump的数据

mongorestore -d test —drop data/backup/test/

参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要备份的文件名
-q:指明备份数据的过滤条件
--authenticationDatabase
--nsInclude :指定还原的集合,支持通配符(*)
--nsExclude:指定不还原的集合,支持通配符(*)
--nsFrom:修改集合名称,原来集合的名称,支持使用变量
--nsTo:修改集合名称,修改之后集合的名称,支持使用变量

//压缩还原无法指定db
mongorestore -h 127.0.0.1 --port 27017 -u root -p password --authenticationDatabase=admin --gzip --archive=dump_dbname.tar.gz

mongoexport

mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。默认导出了JSON格式的数据。如果我们需要导出CSV格式的数据,则需要使用—csv参数

mongoexport -d test -c students —csv -f classid,name,age -o students.dat

参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase

mongoimport

可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据

mongoimport -d test -c students —type csv —headerline —file students.csv

参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
--authenticationDatabase

其它文档

官方文档

docker服务安装

chmod -R go+w /www/data/docker_mongo/
# 1
docker run -d --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=mongopsw -d mongo
# 2
docker run --name mongodb -p 27017:27017 -v /www/data/docker_mongo:/data/db -v /www/data/config/mongodb.conf:/etc/mongo.cnf -d percona/percona-server-mongodb:3.4

系统配置

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongo/mongod.log

processManagement:
  fork: true
  pidFilePath: /var/run/mongod.pid

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

security:
  authorization: enabled

mongodb V3用户管理

# 首先切换到demo数据库下
> use demo;
# 添加一个用户root, 密码是abc123
> db.createUser({
    user: 'mongodb',pwd: 'mongodb#password',
    roles: [{role: 'dbOwner', db: 'demo'},{role: 'dbOwner', db: 'demo2'}]
});
db.createUser({user: 'root',pwd: 'Dev#mongodb',roles: ['root'],mechanisms:["SCRAM-SHA-1"]});
db.auth('root','Dev#mongodb')

# 角色类型
read、readWrite、dbAdmin、dbOwner、readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、root
#授予角色:
db.grantRolesToUser("mongodb",[{role:"readWrite",db:"demo3"}])
#取消角色:
db.grantRolesToUser( "mongodb" , [ { role: "<role>", db: "<database>" } ])
# 测试下是否正确
db.auth("root", "abc123");
# 返回1表示正确
# 修改密码
db.changeUserPassword("root", "2018")
# 查看用户信息
db.getUser('root')

spring-data-mongo连接配置

<mongo:mongo-client id="mongoClient" host="${mongo.host}"
        port="${mongo.port}" credentials="${mongo.username}:${mongo.password}@${mongo.db}">
        <mongo:client-options connections-per-host="${mongo.connectionsPerHost}"
            min-connections-per-host="${mongo.minConnectionsPerHost}"
            threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
            connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}"
            socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}"
            description="${mongo.description}" max-connection-idle-time="${mongo.maxConnectionIdleTime}"
            max-connection-life-time="${mongo.maxConnectionLifeTime}"
            heartbeat-socket-timeout="${mongo.heartbeatSocketTimeout}"
            heartbeat-connect-timeout="${mongo.heartbeatConnectTimeout}"
            min-heartbeat-frequency="${mongo.minHeartbeatFrequency}"
            heartbeat-frequency="${mongo.heartbeatFrequency}" />
    </mongo:mongo-client>
    <mongo:db-factory dbname="${mongo.db}" id="mongoDbFactory"
        mongo-ref="mongoClient" />
<!-- 处理_class字段 -->
    <!-- <bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> 
        <constructor-arg name="typeKey"> <null /> </constructor-arg> </bean> <bean 
        id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" 
        /> <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> 
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> <constructor-arg 
        name="mappingContext" ref="mongoMappingContext" /> <property name="typeMapper" 
        ref="defaultMongoTypeMapper" /> </bean> -->

mongo.host=127.0.0.1
mongo.port=27017
mongo.db=demo
mongo.username=root
mongo.password=DEV#mongodb
mongo.connectionsPerHost=10
mongo.threadsAllowedToBlockForConnectionMultiplier=5
mongo.minConnectionsPerHost=5
mongo.connectTimeout=10000
mongo.maxWaitTime=120000
mongo.socketTimeout=0
mongo.socketKeepAlive=true
mongo.description=mongodb database
mongo.maxConnectionIdleTime=1500
mongo.maxConnectionLifeTime=0
#mongo slave
mongo.heartbeatSocketTimeout=1000
mongo.heartbeatConnectTimeout=1500
mongo.minHeartbeatFrequency=5
mongo.heartbeatFrequency=10

用户

查看一下所有的用户 , 查看当前Db的用户名

db.system.users.find();