1.链接数据库
收先用命令提示符(cmd)进入mongodb的安装目录
cd C:\Program Files\MongoDB\Server\3.4\bin
之后输入链接字符串
mongo --host [数据库IP地址]:[端口号] -u [用户名] -p [密码] --authenticationDatabase [默认数据库]
2.退出数据库
exit
3.切换数据库
use [数据库名称]
4.查询
查询全部
db.[文档名称].find({})
条件查询
db.[文档名称].find({'[查询字段]':[查询值]})
结果排序
正序
db.[文档名称].find({}).sort({'[排序字段]':1})
倒序
db.[文档名称].find({}).sort({'[排序字段]':-1})
时间范围查询
db.[文档名称].find({'[查询字段]': {$gte: ISODate('[开始时间字符串]'), $lt: ISODate('[结束时间字符串]')}})
这里的时间需要考虑时区误差,中国北京的时间需要减去8个小时候再用于查询。
显示的时间加上8个小时候就是北京时间了。
子字段查询
db.[文档名称].find({'[1级字段.2级字段….n级字段]':[查询值]})
5.数据库监测
db.serverStatus()
6.数据库链接数控制
使用 MongoDB 时,可能会遇到因为 mongod 连接数用满了,导致客户端无法连接的问题。mongod的最大连接数通过 net.maxIncomingConnections
指定,默认值为1000000,相当于没有限制,生产环境强烈建议根据实际需求配置,以避免客户端误用导致 mongod 负载过高。
通常每个 MongoClient 会包含一个连接池,默认大小为100,也可以在构造 MongoClient 的时候通过 maxPoolSize 选项来指定。
一种典型的错误使用方式是,用户为每个请求都构造一个 MongoClient,请求结束释放 MongoClient(或根本没释放),这样做问题是请求模型从长连接变成了短连接,每次短连接都会增加『建立 tcp 连接 + mongodb鉴权』的开销,并且并发的请求数会受限于连接数限制,极大的影响性能;另外如果 MongoClient 忘记释放,会导致MongoClient 连接池里连接一直保持着,最终耗光所有的可用连接。
通常用法:
// global MongoClient object
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
// request1
db1 = mongoClient.getDatabase("db1");
coll1 = db1.getCollection("coll1");
coll1.find({...});
// request2
db2 = mongoClient.getDatabase("db2");
coll2 = db2.getCollection("coll2");
coll2.update({...});
// requestN
...
错误用法:
// request1
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
db1 = mongoClient.getDatabase("db1");
coll1 = db1.getCollection("coll1");
coll1.find({...});
mongoClient.close();
// request2
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
db2 = mongoClient.getDatabase("db2");
coll2 = db2.getCollection("coll2");
coll2.update({...});
MongoClient.close()
// requestN
...
通常 MongoClient 使用默认100的连接池(具体默认值以 Driver 的文档为准)都没问题,当访问同一个 Mongod 的源比较多时,则需要合理的规划连接池大小。
如何查看当前连接数
使用mongo shell连接实例,执行如下命令,其中current代表当前已建立连接数,available代表当前可用连接数,internal*的连接用于内部管理,可忽略。
mongo-test:PRIMARY> db.serverStatus().connections
{
"current" : 0,
"available" : 2000,
"internal_current" : 3,
"internal_available" : 497,
"totalCreated" : NumberLong(21)
}
如何查看当前连接主要来自哪些机器
mongoshell或DMS(如果连接数已满,则只能通过DMS来登录查看)连接实例,执行db.runCommand({currentOp: 1, $all: true}),就能输出所有跟该实例建立的所有连接情况,其中client字段包含了服务器的ip地址信息。> db.runCommand({currentOp: 1, $all: true})
{
"inprog" : [
{
"desc" : "conn20",
"threadId" : "140353731274496",
"connectionId" : 20,
"client" : "10.1.2.7:28788",
"active" : false
},
...
如何限制连接数量
如果采用URI来连接实例的,在URI末尾加上&maxPoolSize=xx
来限制到实例的连接数即可,比如你有10台ECS并发访问实例,实例的最大连接数为1000,那么每个ECS上的连接池的数量要控制在100以内。
7.链接字符串说明
下面就是Connection String包含的主要内容
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- mongodb:// 前缀,代表这是一个Connection String
- username:password@ 如果启用了鉴权,需要指定用户密码
- hostX:portX 复制集成员的ip:port信息,多个成员以逗号分割
- /database 鉴权时,用户帐号所属的数据库
- ?options 指定额外的连接选项
8.连接复制集
例如通过java来连接
MongoClientURI connectionString = new MongoClientURI("mongodb://root:****@dds-bp114e3f1fc441342.mongodb.rds.aliyuncs.com:3717,dds-bp114e3f1fc441341.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-677201"); // ****替换为root密码
MongoClient client = new MongoClient(connectionString);
MongoDatabase database = client.getDatabase("mydb");
MongoCollection<Document> collection = database.getCollection("mycoll");
通过正确的Connection String来连接MongoDB复制集时,客户端会自动检测复制集的主备关系,**当主备关系发生变化时,自动将写切换到新的主上**,以保证服务的高可用。
9.读写分离
在options里添加readPreference=secondaryPreferred
即可实现,读请求优先到Secondary节点,从而实现读写分离的功能。
10.如何保证数据写入到大多数节点后才返回
在options里添加w=majority
即可保证写请求成功写入大多数节点才向客户端确认。(不明觉厉)