我的mongoDB笔记

来源:互联网 发布:守望先锋 伤害数据 编辑:程序博客网 时间:2024/05/21 10:50

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 objectmongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");// request1db1 = mongoClient.getDatabase("db1");coll1 = db1.getCollection("coll1");coll1.find({...});// request2db2 = mongoClient.getDatabase("db2");coll2 = db2.getCollection("coll2");coll2.update({...});// requestN...

错误用法:

// request1mongoClient = 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();// request2mongoClient = 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即可保证写请求成功写入大多数节点才向客户端确认。(不明觉厉)