MongoDB进阶

安全和认证

admin数据库中创建管理员账号:
use admin;
db.addUser(“root”,”root”);

test数据库中创建普通账号:
use test;
db.addUser(“zhangsan”,”123”);
db.addUser(“lisi”,”123”,true);
*注意:
用户zhangsan,密码为123,对test数据库拥有读写权限
用户lisi,密码为123,对test数据库拥有只读权限

重新启动数据库服务,并开启安全检查
mongod --dbpath d:\mongo_data --auth

主从复制

启动主节点:mongod --dbpath d:\master --port 10000 --master
启动从节点:mongod --dbpath d:\slave --port 10001 --slave --source localhost:10000
启动成功后就可以连接主节点进行操作了,而这些操作会同步到从节点。

副本集

副本集就是有自动故障恢复功能的主从集群。

主从集群和副本集最大的区别就是副本集没有固定的“主节点”;整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。
启动节点1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port 10001 --replSet test/localhost:10002 --master

启动节点2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port 10002 --replSet test/localhost:10001

启动节点3:
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port 10003 --replSet test/localhost:10001,localhost:10002
初始化节点(只能初始化一次):随便登录一个节点,以10001为例
*** mongo localhost:10001/admin**
db.runCommand({ "replSetInitiate":{ "_id":“test", "members":[ { "_id":1, "host":"localhost:10001", "priority":3 }, { "_id":2, "host":"localhost:10002", "priority":2 }, { "_id":3, "host":"localhost:10003", "priority":1 } ]}});

查询当前主库,登录10002
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );

Alt text

分片(sharding)分布式存储

分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。

MongoDB分片的基本思想就是将集合切分成小块。这些块分散到若干片里面,每个片只负责总数据的一部分。应用程序不必知道哪片对应哪些数据,甚至不需要知道数据已经被拆分了,所以在分片之前要运行一个路由进程,该进程名为mongos。这个路由器知道所有数据的存放位置,所以应用可以连接它来正常发送请求。对应用来说,它仅知道连接了一个普通的mongod。路由器知道数据和片的对应关系,能够转发请求到正确的片上。如果请求有了回应,路由器将其收集起来回送给应用。
待续。。。。

使用java操作MongoDB

  • 1、查询集合中所有文档
Mongo mongo = new Mongo("localhost",27017);
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("customer");
DBCursor dbCursor = collection.find();
System.out.println(collection.getCount());
while(dbCursor.hasNext()){
System.out.println(dbCursor.next());
}
mongo.close();
  • 2、删除集合中的文档
Mongo mongo = new Mongo("localhost",27017);
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("customer");
BasicDBObject o = new BasicDBObject("_id", new ObjectId("5199ee647d5fc789bc760c07"));
collection.remove(o);
mongo.close();
  • 3、向集合中插入文档
Mongo mongo = new Mongo("localhost",27017);
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("customer");
DBObject c = new BasicDBObject();
c.put("name", “jack");
c.put("age", 24);
collection.insert(c);
mongo.close();
  • 4、更新集合中的文档
Mongo mongo = new Mongo("localhost",27017);
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("customer");
BasicDBObject query = new BasicDBObject("_id",new ObjectId("519e2e393296cf3baccdb10c"));
BasicDBObject object = (BasicDBObject) collection.findOne(query);
object.put("name", “wangwu");
int n = collection.update(query, object).getN();
System.out.println(n);
mongo.close();