MongoDB windows 安装:
- cmd 窗口 mongod.exe --dbpath=C:\MongoDBDATA ,cmd窗口不要关闭
- mongo.exe
- 创建数据库:use whl (切换到whl 数据库,如果没有则创建,如果什么不操作,就会删除whl库)
- 创建表(集合):db.createCollection(“users”) db.oldname.renameCollection(“newName”)修改名称 db.getCollectionNames();
- 插入数据:db.users.insert({username:'dalin'}) db.users.insert({username:'lisi',age:20})
- 查询所有数据:db.users.find(); ObjectID,这是在Collection中唯一的数值,是mongodb自动进行分配的,HASH
- 统计该collection所有个数: db.users.count();
- 条件查询:db.user.find({username:'lisi'}) (查询用户名为 lisi的记录) db.users.findOne();db.users.find();
- 更新:db.users.update({username:'lisi'},{$set:{username:'lisisi'}}); db.user.update({更新查询条件},{$set:{更新内容}}),更新符合查询条件的内容,如果字段不存在,则添加相应字段并进行更新
- 删除数据:db.users.remove();
- 删除集合:db.users.drop();
- 创建用户名密码,是否只读:db.addUser("wei","123321",false);
日期字符串比较:
db.log2012-11-26.find({ "$or" : [{ "addtimestr" : { "$lte" : "2012-11-26" } }, { "addtimestr" : { "$gte" : "2012-11-27" } }] }).limit(100);
1.1在shell查看数据库已经建立的索引
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);//创建唯一索引
}
}