java-Mongo的工具

package com.angular.base.util.mongodb;

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.bson.BSONObject;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import com.angular.oborInfo.po.Kv;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MapReduceOutput;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

public class MongoDbUtil {

    private  MongoClient mg=null;  //连接mongo的主要工具
    private MongoDbUtil(String host,int port,String database,String username,String password)
        {
            if (mg == null)
            {
                MongoClientOptions.Builder buide = new MongoClientOptions.Builder();
                buide.connectionsPerHost(100);// 与目标数据库可以建立的最大链接数
                buide.connectTimeout(1000 * 60 * 20);// 与数据库建立链接的超时时间
                buide.maxWaitTime(100 * 60 * 5);// 一个线程成功获取到一个可用数据库之前的最大等待时间
                buide.threadsAllowedToBlockForConnectionMultiplier(100);
               // buide.maxAutoConnectRetryTime(0); //最大自动连接重试时间
              
                  buide.maxConnectionIdleTime(0); //最大连接 闲置时间
                 buide.maxConnectionLifeTime(0); // 最大连接生存时间
                buide.socketTimeout(0);
                buide.socketKeepAlive(true);
                MongoClientOptions myOptions = buide.build();
                try
                {
                    ServerAddress sa = new ServerAddress(host, port);
                    List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>();
                    mongoCredentialList.add(MongoCredential.createCredential(username, database, password.toCharArray()));
                    if(!"".equals(username)&&!"".equals(password)){
                    mg=new MongoClient(sa, mongoCredentialList,myOptions);
                    }else{
                    mg=new MongoClient(sa,myOptions);
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    
//单例模式
public static MongoDbUtil getInstance(String host,int port,String database,String username,String password){
    return new MongoDbUtil(host,port,database,username,  password);
}

//查询所有的数据库
public List<String> getAllDB(){
    List<String>   list=new ArrayList<String>();
     for (String name : mg.getDatabaseNames()) {
         list.add(name);
     }
    return list;
}

//查询对应数据库的所有集合
public List<String> getTargetDB(String db){
    List<String>   list=new ArrayList<String>();
      for (String name : this.mg.getDB(db).getCollectionNames()) {
          list.add(name);
      }
    return list;
}

//得到指定数据库的指定集合
public DBCollection getCollection(String db,String collection){
     return this.mg.getDB(db).getCollectionFromString(collection);
}
//判断指定集合指定字段是否有索引 有索引 则不创建索引  无的话则创建
public boolean judgeIndex(String db,String collection,String files){
    String index=files+"_1";
    int m=0;
    List<DBObject> indexInfo = getCollection(db, collection).getIndexInfo();
    for(DBObject o:indexInfo){
        for(String keys:o.keySet()){
            if(o.get(keys).equals(index)){
                m=1;
            }
    }
    }
    if(m==0){
            getCollection(db, collection).createIndex(new BasicDBObject(files, 1));
            System.out.println(db+"-"+collection+"-"+files+"字段索引创建成功");
        }else{
            System.out.println(db+"-"+collection+"-"+files+"已经有索引");
        }
    return true;
}



//插入数据到指定数据库,指定集合 (单个插入)
public boolean insertOne(String db,String collection,DBObject o){
    getCollection(db, collection).insert(o);
    return true;
}

/**
 * 批量插入
 * 
 * @param collection
 * @param list
 *   插入的列表
 */
public void insertBatch(String db,String collection, List<DBObject> list) {

    if (list == null || list.isEmpty()) {
        return;
    }

    getCollection(db,collection).insert(list);

}

/**
 * 删除
 * 
 * @param collection
 * @param q
 *   查询条件
 */
public void delete(String db,String collection, DBObject q) {

    getCollection(db,collection).remove(q);
}

/**
 * 批量删除
 * 
 * @param collection
 * @param list
 *  删除条件列表
 */
public void deleteBatch(String db,String collection, List<DBObject> list) {
    if (list == null || list.isEmpty()) {
        return;
    }
    for (int i = 0; i < list.size(); i++) {
        getCollection(db,collection).remove(list.get(i));
    }
}

/**
 * 计算集合总条数
 * 
 * @param collection
 */
public long getCount(String db,String collection) {

    return getCollection(db,collection).find().count();
}


/**
 * 计算满足条件条数
 * 
 * @param collection
 * @param q
 *            查询条件
 */

public long getCount(String db,String collection, DBObject q) {
    return getCollection(db,collection).getCount(q);
}

/**
 * 更新
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param setFields
 *            更新对象
 */
public void update(String db,String collection, DBObject q, DBObject setFields) {

    getCollection(db,collection).updateMulti(q,new BasicDBObject("$set", setFields));
}

/**
 * 查找集合所有对象
 * 
 * @param collection
 */
public List<DBObject> findAll(String db,String collection) {

    return getCollection(db,collection).find().toArray();
}

/**
 * 按顺序查找集合所有对象
 * 
 * @param collection
 *            数据集
 * @param orderBy
 *            排序
 */
public List<DBObject> findAll(String db,String collection, DBObject orderBy) {

    return getCollection(db,collection).find().sort(orderBy).toArray();
}

/**
 * 查找(返回一个对象)
 * 
 * @param collection
 * @param q
 *            查询条件
 */
public DBObject findOne(String db,String collection, DBObject q) {

    return getCollection(db,collection).findOne(q);
}

/**
 * 查找(返回一个对象)
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param fileds
 *            返回字段
 */
public DBObject findOne(String db,String collection, DBObject q, DBObject fileds) {

    return getCollection(db,collection).findOne(q, fileds);
}


/**
 * 查找返回特定字段(返回一个List<DBObject>)
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param fileds
 *            返回字段
 */
public List<DBObject> findLess(String db,String collection, DBObject q, DBObject fileds) {

    DBCursor c = getCollection(db,collection).find(q, fileds);
    if (c != null)
        return c.toArray();
    else
        return null;
}


/**
 * 查找返回特定字段(返回一个List<DBObject>)
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param fileds
 *            返回字段
 * @param orderBy
 *            排序
 */
public List<DBObject> findLess(String db,String collection, DBObject q, DBObject fileds, DBObject orderBy) {

    DBCursor c = getCollection(db,collection).find(q, fileds).sort(orderBy);
    if (c != null)
        return c.toArray();
    else
        return null;
}

/**
 * 分页查找集合对象,返回特定字段
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param fileds
 *            返回字段
 * @pageNo 第n页
 * @perPageCount 每页记录数
 */
public List<DBObject> findLess(String db,String collection, DBObject q, DBObject fileds, int pageNo,
        int perPageCount) {

    return getCollection(db,collection).find(q, fileds)
    .skip((pageNo - 1) * perPageCount).limit(perPageCount)
            .toArray();
}


/**
 * 按顺序分页查找集合对象,返回特定字段
 * 
 * @param collection
 *            集合
 * @param q
 *            查询条件
 * @param fileds
 *            返回字段
 * @param orderBy
 *            排序
 * @param pageNo
 *            第n页
 * @param perPageCount
 *            每页记录数
 */
public List<DBObject> findLess(String db,String collection, DBObject q, DBObject fileds, DBObject orderBy,
        int pageNo, int perPageCount) {

    return getCollection(db,collection).find(q, fileds)
            .sort(orderBy).skip((pageNo - 1) * perPageCount)
            .limit(perPageCount).toArray();
}

/**
 * 查找(返回一个List<DBObject>)
 * 
 * @param collection
 * @param q
 *            查询条件
 */
public List<DBObject> find(String db,String collection, DBObject q) {

    DBCursor c = getCollection(db,collection).find(q);
    if (c != null)
        return c.toArray();
    else
        return null;
}

/**
 * 按顺序查找(返回一个List<DBObject>)
 * 
 * @param collection
 * @param q
 *            查询条件
 * @param orderBy
 *            排序
 */
public List<DBObject> find(String db,String collection, DBObject q, DBObject orderBy) {

    DBCursor c = getCollection(db,collection).find(q).sort(orderBy);
    if (c != null)
        return c.toArray();
    else
        return null;
}

/**
 * 分页查找集合对象
 * 
 * @param collection
 * @param q
 *            查询条件
 * @pageNo 第n页
 * @perPageCount 每页记录数
 */
public List<DBObject> find(String db,String collection, DBObject q, int pageNo,
        int perPageCount) {

    return getCollection(db,collection).find(q)
            .skip((pageNo - 1) * perPageCount).limit(perPageCount)
            .toArray();
}

/**
 * 按顺序分页查找集合对象
 * 
 * @param collection
 *            集合
 * @param q
 *            查询条件
 * @param orderBy
 *            排序
 * @param pageNo
 *            第n页
 * @param perPageCount
 *            每页记录数
 */
public List<DBObject> find(String db,String collection, DBObject q, DBObject orderBy,
        int pageNo, int perPageCount) {

    return getCollection(db,collection).find(q)
            .sort(orderBy).skip((pageNo - 1) * perPageCount)
            .limit(perPageCount).toArray();
}

/**
 * distinct操作
 * 
 * @param collection
 *            集合
 * @param field
 *            distinct字段名称
 */
public Object[] distinct(String db,String collection, String field) {

    return getCollection(db,collection).distinct(field).toArray();
}

/**
 * distinct操作
 * 
 * @param collection
 *            集合
 * @param field
 *            distinct字段名称
 * @param q
 *            查询条件
 */
public Object[] distinct(String db,String collection, String field, DBObject q) {

    return getCollection(db,collection).distinct(field, q).toArray();
}
    
/**
 * group分组查询操作,返回结果少于10,000keys时可以使用
 * 
 * @param collection
 *            集合
 * @param key
 *            分组查询字段
 * @param q
 *            查询条件
 * @param reduce
 *            reduce Javascript函数,如:function(obj, out){out.count++;out.csum=obj.c;}
 * @param finalize
 *            reduce function返回结果处理Javascript函数,如:function(out){out.avg=out.csum/out.count;}
 */
public BasicDBList group(String db,String collection, DBObject key, DBObject q, DBObject initial, String reduce, String finalize) {

    return ((BasicDBList)getCollection(db,collection).group(key, q, initial, reduce, finalize));
}

/**
 * group分组查询操作,返回结果大于10,000keys时可以使用
 * 
 * @param collection
 *            集合
 * @param map
 *            映射javascript函数字符串,如:function(){ for(var key in this) { emit(key,{count:1}) } }
 * @param reduce
 *            reduce Javascript函数字符串,如:function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count;  } return {count:total}; }
 * @param q
 *            分组查询条件
 * @param orderBy
 *            分组查询排序
 */
public Iterable<DBObject> mapReduce(String db,String collection, String map, String reduce, DBObject q, DBObject orderBy) {
    //DBCollection coll =getCollection(db,collection);
    //MapReduceCommand cmd = new MapReduceCommand(coll, map, reduce, null, MapReduceCommand.OutputType.INLINE, q);
    //return coll.mapReduce(cmd).results();
    MapReduceOutput out = getCollection(db,collection).mapReduce(map, reduce, null, q);
    return out.getOutputCollection().find().sort(orderBy).toArray();
}

/**
 * group分组分页查询操作,返回结果大于10,000keys时可以使用
 * 
 * @param collection
 *            集合
 * @param map
 *            映射javascript函数字符串,如:function(){ for(var key in this) { emit(key,{count:1}) } }
 * @param reduce
 *            reduce Javascript函数字符串,如:function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count;  } return {count:total}; }
 * @param q
 *            分组查询条件
 * @param orderBy
 *            分组查询排序
 * @param pageNo
 *            第n页
 * @param perPageCount
 *            每页记录数
 */
public List<DBObject> mapReduce(String db,String collection, String map, String reduce, 
        DBObject q, DBObject orderBy, int pageNo, int perPageCount) {

    MapReduceOutput out = getCollection(db,collection).mapReduce(map, reduce, null, q);
    return out.getOutputCollection().find().sort(orderBy).skip((pageNo - 1) * perPageCount)
            .limit(perPageCount).toArray();
}

/**
 * group分组查询操作,返回结果大于10,000keys时可以使用
 * 
 * @param collection
 *            集合
 * @param map
 *            映射javascript函数字符串,如:function(){ for(var key in this) { emit(key,{count:1}) } }
 * @param reduce
 *            reduce Javascript函数字符串,如:function(key,emits){ total=0; for(var i in emits){ total+=emits[i].count;  } return {count:total}; }
 * @param outputCollectionName
 *            输出结果表名称
 * @param q
 *            分组查询条件
 * @param orderBy
 *            分组查询排序
 */
public List<DBObject> mapReduce(String db,String collection, String map, String reduce, 
        String outputCollectionName, DBObject q, DBObject orderBy) {
        if (!this.mg.getDB(db).collectionExists(outputCollectionName)) {
        getCollection(db,collection).mapReduce(map, reduce, outputCollectionName, q);
      }
return getCollection(db,outputCollectionName).find(null,new BasicDBObject("_id",false)).sort(orderBy).toArray();
}

//查询给定两个数据之间的数据
public List<DBObject> findBetween(String db,String collection,String key,Object a,Object b){
    BasicDBObject query = new BasicDBObject();
    query.put("$gt",a);
    query.put("$lt",b);
    BasicDBObject query1 = new BasicDBObject();
    query1.put(key, query);
    return getCollection(db,collection).find(query1).toArray();
}

//查询大于给定参数
public List<DBObject> findGT(String db,String collection,String key,Object a){
    BasicDBObject query = new BasicDBObject();
    query.put("$gt",a);
    BasicDBObject query1 = new BasicDBObject();
    query1.put(key, query);
    return getCollection(db,collection).find(query1).toArray();
}

//查询大于等于给定参数
public List<DBObject> findGTE(String db,String collection,String key,Object a){
    BasicDBObject query = new BasicDBObject();
    query.put("$gte",a);
    BasicDBObject query1 = new BasicDBObject();
    query1.put(key, query);
    return getCollection(db,collection).find(query1).toArray();
}

//查询小于给定参数
public List<DBObject> findLT(String db,String collection,String key,Object a){
    BasicDBObject query = new BasicDBObject();
    query.put("$lt",a);
    BasicDBObject query1 = new BasicDBObject();
    query1.put(key, query);
    return getCollection(db,collection).find(query1).toArray();
}

//查询小于等于给定参数
public List<DBObject> findLTE(String db,String collection,String key,Object a){
    BasicDBObject query = new BasicDBObject();
    query.put("$lte",a);
    BasicDBObject query1 = new BasicDBObject();
    query1.put(key, query);
    return getCollection(db,collection).find(query1).toArray();
}

//模糊匹配
public List<DBObject> findByRegex(String db,String collection,List<Kv> conditions){
    BasicDBObject query = new BasicDBObject();
    Pattern pattern  = null;
    //List<Pattern>  patList= new ArrayList<Pattern>();
    for(Kv kv:conditions){
        pattern = Pattern.compile("^.*"+kv.getValue()+".*$", Pattern.CASE_INSENSITIVE);
        query.put(kv.getKey(), pattern);
    }

    return getCollection(db,collection).find(query).toArray(); 
}

//分页查询
public List<DBObject> getPagedata (String db,String collection,List<Kv> conditions,int page,int size){
    DBObject query = new BasicDBObject();
    DBCursor dbCursor;
    Pattern pattern  = null;
    //List<Pattern>  patList= new ArrayList<Pattern>();
    for(Kv kv:conditions){
        pattern = Pattern.compile("^.*"+kv.getValue()+".*$", Pattern.CASE_INSENSITIVE);
        query.put(kv.getKey(), pattern);
    }
        dbCursor = getCollection(db,collection).find(query).sort(new BasicDBObject("crawl_time",-1)).skip(size * (page - 1)).limit(size);
    return dbCursor.toArray();
    
    
}


}

 

posted @ 2018-03-05 11:06  Mr_WeiLin  阅读(213)  评论(0编辑  收藏  举报