MongoDB常用API及优化

MongoDB windows 安装:

  1. cmd 窗口 mongod.exe --dbpath=C:\MongoDBDATA cmd窗口不要关闭
  2. mongo.exe
    1. 创建数据库:use whl (切换到whl 数据库,如果没有则创建,如果什么不操作,就会删除whl库)
    2. 创建表(集合)db.createCollection(“users”)   db.oldname.renameCollection(“newName”)修改名称  db.getCollectionNames();
    3. 插入数据:db.users.insert({username:'dalin'})   db.users.insert({username:'lisi',age:20})
    4. 查询所有数据:db.users.find();  ObjectID,这是在Collection中唯一的数值,是mongodb自动进行分配的,HASH
    5. 统计该collection所有个数: db.users.count();
    6. 条件查询:db.user.find({username:'lisi'}) (查询用户名为 lisi的记录)  db.users.findOne();db.users.find();
    7. 更新:db.users.update({username:'lisi'},{$set:{username:'lisisi'}}); db.user.update({更新查询条件},{$set:{更新内容}}),更新符合查询条件的内容,如果字段不存在,则添加相应字段并进行更新
    8. 删除数据:db.users.remove();
    9. 删除集合:db.users.drop();
    10. 创建用户名密码,是否只读:db.addUser("wei","123321",false);

日期字符串比较:

db.log2012-11-26.find({ "$or" : [{ "addtimestr" : { "$lte" : "2012-11-26" } }, { "addtimestr" : { "$gte" : "2012-11-27" } }] }).limit(100);

db.users.update({name:"paul"},{$set:{age:25}});
db.users.update({name:"peter"},{$set:{age:25}}, true ); //查到就更新,查不到就添加
db.users.update({name:"peter"},{$set:{age:30}},true, true ); //如不存在是否插入,是否更新多条记录
$inc:{size:1}   //size字段每次累加1
document数组,当document增大时候,会造成顺序混乱因为内存重新分配,会把大document放入最后
索引:
db.books.ensureIndex({numver:1}); //正序索引
db.books.ensureIndex({numver:-1}); //倒序索引
索引名称默认:number_1或者number_-1
db.books.ensureIndex({numver:-1},{name:"name_index"}); //指定索引名称
db.books.ensureIndex({numver:-1}, {unique:true} ); //唯一索引
db.books.ensureIndex({numver:-1}, {unique:true,dropDups:true} ) //如果创建唯一索引之前想先删除重复键
db.books.find({name:"ibook",number:1}).hint({name:-1}) //强制使用指定索引
db.books.find({name:"ibook",number:1}).explain(); //查询执行计划 system.indexes

1.1shell查看数据库已经建立的索引

              db.system.indexes.find()

              db.system.namespaces.find()

2.1执行创建索引的过程会暂时锁表问题如何解决?

              为了不影响查询我们可以叫索引的创建过程在后台(将内存中数据刷新到硬盘

              db.books.ensureIndex({name:-1},{background:true})

3.1批量和精确删除索引

              db.runCommand({dropIndexes : ”books” , index:”name_-1”})

              db.runCommand({dropIndexes : ”books” , index:”*”})

MongoDB优化:

1.查询优化

 充分利用到了索引

2.搞清你的热数据大小

保证你的热数据在你机器的内存大小之下

3.选择正确的文件系统

尽量不要用ext3,用ext4或者xfs。

4.选择合适的硬盘

对磁盘RAID的选择,当然SSD更好。

5.Shard分片

在单个节点压力太大时,使用auto-sharding机制来将数据分片到多个节点以缓解压力

分布式-Sharding(碎片)

MongoDB的auto-sharding功能是指mongodb通过mongos自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。一个mongodb集群包括一些shards(包括一些mongod进程),mongos路由进程,一个或多个config服务器

Shards

每一个shard包括一个或多个服务和存储数据的mongod进程(mongod是MongoDB数据的核心进程)典型的每个shard开启多个服务来提高服务的可用性。这些服务/mongod进程在shard中组成一个复制集

Chunks

Chunk是一个来自特殊集合中的一个数据范围,(collection,minKey,maxKey)描叙一个chunk,它介于minKey和maxKey范围之间。例如chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的chunks中。当一个shard的数据过量时,chunks将会被迁移到其他的shards上。同样,chunks也可以迁移到其他的shards上。

Config Servers

Config服务器存储着集群的metadata信息,包括每个服务器,每个shard的基本信息和chunk信息,Config服务器主要存储的是chunk信息。每一个config服务器都复制了完整的chunk信息


Java 常用API:

保存及更新:

@Override

     public void saveOrUpdateObject(Object bean, String idName) {

         if(bean == null) return;

         Class clazz = bean.getClass();

         Map beanMap = BeanUtil.getBeanMap(bean);

         String collname = clazz.getCanonicalName();    //collection集合名字相当于表名

         DBCollection coll = db.getCollection(collname);

         Object id = null;

         try {

              id = beanMap.get(idName);//获取对象id的值

         } catch (Exception e) {

              dbLogger.error(StringUtil.getExceptionTrace(e, 2));

              throw new IllegalArgumentException("mongodb: id can't be null!", e);

         }

         DBObject result = coll.findOne(new BasicDBObject(idName, id));//根据对象id的值,查询是否存在

         if(result == null) result = new BasicDBObject();//不存在就新建一个对象

         result.putAll(beanMap);//拷贝属性

         coll.save(result);//collection集合保存对象

     }

分页:

 @Override

     public <T> List<T> getObjectList(Class<T> clazz, DBObject params, String orderField, boolean asc, int from, int maxnum){

         String namespace = clazz.getCanonicalName();

         DBObject orderBy = new BasicDBObject(orderField, asc?1:-1);

         DBCursor cur = db.getCollection(namespace).find(params).sort(orderBy).skip(from).limit(maxnum);//分页  params:查询 sort 排序

         DBObject dbo;

         List<T> result = new ArrayList<T>();

         T bean;

         while(cur.hasNext()){

              dbo = cur.next();

              try {

                  bean = clazz.newInstance();

                  PropertyUtils.copyProperties(bean, dbo.toMap());//拷贝属性

                  result.add(bean);

              } catch (Exception e) {

                  dbLogger.warn(StringUtil.getExceptionTrace(e, 2));

              }

         }

         return result;

     }

分组:

     @Override

     public List<Map> getGroupBy(String namespace, String groupByFiled, DBObject cond, DBObject initial, String reduce, String finalize) {

         DBCollection collection = db.getCollection(namespace);

         DBObject object = collection.group(new BasicDBObject(groupByFiled, "true"), cond, initial, reduce, finalize);

        //分组  cond:(条件)initial(初始化变量)reduce(规约器相当于count(*) group by   finalize:遍历每个group by 字段返回结果后的处理方法

         return (List<Map>) object;

     }

     @Override

     public void createIndexes(String namespace, String indexes){

         createIndexes(namespace, indexes, false);

     }

建索引:

@Override

     public void createIndexes(String namespace, String indexes, boolean unique){

         DBCollection collection = db.getCollection(namespace);

         if(StringUtils.isNotBlank(indexes)){

              String indexname = StringUtils.replace(indexes, ",", "_");

              String[] arrs = StringUtils.split(indexes, ",");

              DBObject keys = new BasicDBObject();

              for(String idx : arrs){

                  keys.put(idx, 1);

              }

              collection.ensureIndex(keys, indexname, unique);//创建唯一索引

         }

     }





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值