环境:jdk1.8,mongodb,eclipse
mongodb-jar包: mongo-java-driver-3.4.2.jar
MongoDBUtil 中main方法,为查询实例
updateState方法,为修改数据
package com.cn.util.mongo;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.bson.types.ObjectId;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.WriteResult;
public class MongoDBUtil {
/** 获取MongoClient */
MongoClient mongoClient = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
public void getClient() {
if (mongoClient != null) {
return;
}
while (true) {
try {
MongoClientOptions.Builder buide = new MongoClientOptions.Builder();
buide.connectionsPerHost(100);// 与目标数据库可以建立的最大链接数
buide.connectTimeout(1000 * 60 * 20);// 与数据库建立链接的超时时间
buide.maxWaitTime(1000 * 60 * 10);// 一个线程成功获取到一个可用数据库之前的最大等待时间
buide.threadsAllowedToBlockForConnectionMultiplier(5);
buide.maxConnectionIdleTime(0);
buide.maxConnectionLifeTime(0);
buide.socketTimeout(0);
buide.socketKeepAlive(true);
MongoClientURI connectionString = new MongoClientURI(
"mongodb://root:tlMongo2017@1**.1**.1**.2**:37018/admin", buide);
mongoClient = new MongoClient(connectionString);
System.out.println("MongoDB已开启...");
} catch (Exception e) {
System.err.println("MongoDB连接异常," + (600000 / 1000 / 60) + "min后重新连接");
System.err.println("当前时间为" + sdf.format(System.currentTimeMillis()));
try {
Thread.sleep(600000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
continue;
}
System.out.println("New MongoDBClient Success");
break;
}
}
public static void main(String[] args) {
new MongoDBUtil().test();
}
// mongo操作语句:db.getCollection('dimension').find({'typeId':'58e746b798a8ffc7045f9903'})
private void test() {
if (mongoClient == null) {
getClient();
}
// DBName, CollectionName:获取tianluo_manage库中dimension表,typeId为""的数据
DBCollection dimensionCol = getCollection("tianluo_manage", "dimension");
DBCursor a = dimensionCol.find(new BasicDBObject("typeId", "58e746b798a8ffc7045f9903"));
Iterator<DBObject> iterator = a.iterator();
while (iterator.hasNext()) {
DBObject next = iterator.next();
String id = next.get("_id").toString();
String name = next.get("dimensionName").toString();
String code = next.get("dimensionId").toString();
System.out.println(id + " " + name + " " + code);
}
}
/**
* Mongodb指定条数游标查询
*
* @param esSyncStates
* 栏目List
* @param args
* 状态
* @param limit
* 条数
*/
public List<DBObject> findByPage(String mdimension, String state, int limit) {
while (true) {
List<String> esSyncStates = getEsSyncState(mdimension);
int limit_temp = limit;
System.out.println("分页查询开始");
if (mongoClient == null) {
getClient();
}
DBCollection coll = getCollection("tianluo_etl", "ES_DATA");
List<DBObject> dataList = new ArrayList<DBObject>();
for (int i = 0; i < esSyncStates.size(); i++) {
if (limit_temp - dataList.size() <= 0) {
break;
}
BasicDBObject args = new BasicDBObject();
args.append("menuId", esSyncStates.get(i));
args.append("state", state);
DBCursor find = coll.find(args).limit(limit_temp - dataList.size());
find.hint("menuId_1_state_1_updateTime_-1");
while (find.hasNext()) {
DBObject doc = find.next();
dataList.add(doc);
}
find.close();
}
System.out.println("分页结束");
if (dataList.isEmpty()) {
System.out.println("维度:" + mdimension);
System.out.println("可同步栏目个数:" + esSyncStates.size());
System.out.println("待同步数据状态:" + state);
System.out.println("单次同步条数:" + limit);
System.out.println("已查询条数:" + dataList.size());
close();
sleep(60000, "数据处理完毕,已结束");
getClient();
continue;
}
return dataList;
}
}
/**
* 针对ObjectId,对普通值进行包装
*
* @param value
* @return
*/
public ObjectId getObjectId(String value) {
ObjectId _idobj = null;
try {
_idobj = new ObjectId(value);
} catch (Exception e) {
return null;
}
return _idobj;
}
// 通过_id修改数据,Map以修改的字段为键,修改的值为值
public long updateById(DBCollection collection, String _id, Map<String, Object> column_value) {
if (mongoClient == null) {
getClient();
}
ObjectId _idobj = getObjectId(_id);
if (_idobj == null) {
return 0;
}
BasicDBObject newdoc = new BasicDBObject();
newdoc.putAll(column_value);
WriteResult rs = collection.update(new BasicDBObject("_id", _idobj), new BasicDBObject("$set", newdoc));
return rs.isUpdateOfExisting() ? 1 : 0;
}
/**
* @param DB名称
* @param Collection名称
* @return DBCollection
*/
@SuppressWarnings("deprecation")
public DBCollection getCollection(String DBName, String CollectionName) {
if (mongoClient == null) {
getClient();
}
DBCollection coll = mongoClient.getDB(DBName).getCollection(CollectionName);
return coll;
}
// 查询总数
public long getCount(DBCollection coll, BasicDBObject args, String hint) {
DBCursor find = coll.find(args);
if (hint != null) {
find = find.hint(hint);
}
return find.count();
}
// 关闭MongoDB
public void close() {
System.setProperty("DEBUG.MONGO", "false");
System.setProperty("DB.TRACE", "true");
if (mongoClient != null) {
System.out.println("MongoDB已关闭...");
mongoClient.close();
mongoClient = null;
}
}
// 修改状态state和时间updateTime和错误信息description
public long updateState(String _id, String state, String message, String sign, String id) {
Map<String, Object> column_value = new HashMap<String, Object>();
column_value.put("state", state);
if (message != null && !"".equals(message.trim())) {
System.out.println(message);
column_value.put("description", message);
}
column_value.put("updateTime", System.currentTimeMillis());
column_value.put("updateYMD", sdf2.format(System.currentTimeMillis()));
column_value.put("sign", sign);
column_value.put("esId", id);
long updateRs = updateById(getCollection("tianluo_etl", "ES_DATA"), _id, column_value);
return updateRs;
}
/**
* 通过条件获取一条数据
*
* @param args
* 条件Map
* @param indexName
* 索引名称
* @param dimensionId
* 表名
* @return
*/
public DBObject getOneData(DBCollection collection, BasicDBObject args, String indexName) {
DBCursor find = collection.find(args);
if (indexName != null) {
find.hint(indexName);
}
DBObject myDoc = null;
if (find.hasNext()) {
myDoc = find.next();
}
return myDoc;
}
/**
* 通过条件获取所有数据
*
* @param args
* 条件Map
* @param indexName
* 索引名称
* @param dimensionId
* 表名
* @return
*/
public List<DBObject> getAllData(DBCollection collection, BasicDBObject args, String indexName) {
DBCursor find = collection.find(args);
if (indexName != null) {
find.hint(indexName);
}
List<DBObject> l = new ArrayList<DBObject>();
while (find.hasNext()) {
DBObject myDoc = find.next();
l.add(myDoc);
}
return l;
}
// 获取某维度中的一条数据的同步状态
public List<String> getEsSyncState(String weidu) {
while (true) {
System.out.println("获取栏目同步状态");
DBCollection dimensionCol = getCollection("tianluo_manage", "dimension");
DBCursor di = dimensionCol.find(new BasicDBObject("dimensionId", weidu));
String weiduId = null;
if (di.hasNext()) {
DBObject d = di.next();
weiduId = d.get("_id").toString();
}
if (weiduId == null) {
close();
sleep(600000, "该维度不存在,已结束");
getClient();
continue;
}
;
DBCollection menuCol = getCollection("tianluo_manage", "menu");
BasicDBObject esSyncState = new BasicDBObject();
esSyncState.put("esSyncState", 3);
esSyncState.put("dimensionId", weiduId);
DBCursor it = menuCol.find(esSyncState);
List<String> codes = new ArrayList<String>();
while (it.hasNext()) {
DBObject doc = it.next();
codes.add(doc.get("_id").toString());
}
if (codes.size() == 0) {
close();
sleep(600000, "该维度无开启栏目,已结束");
getClient();
continue;
}
System.out.println(codes.size() + "个状态开启的栏目");
return codes;
}
}
// 休眠时间
public void sleep(int time, String notice) {
System.out.println("睡眠" + (time / 1000)+"秒!!");
if (notice != null && !"".equals(notice.trim())) {
System.out.println(notice);
}
System.out.print("0s>>");
for (int i = 0; i < time / 20000; i++) {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i > 0 && i % 5 == 0) {
System.out.println();
}
System.out.print((i + 1) * 20 + "s>>");
}
System.out.println();
}
}
mongo操作:
-
查询语句(上面代码java查询main方法实例):查询dimension表中typeId为 “58e…”的数据
db.getCollection(‘dimension’).find({‘typeId’:‘58e746b798a8ffc7045f9903’}) -
查询pboc_xuke表中timeTo字段不为12月 的数据
db.getCollection(‘pboc_xuke’).find({‘timeTo’:{$ne:‘12月’}}) -
查询safe_xuke表中passStandar字段不为(多个条件)
db.getCollection(‘safe_xuke’).find({‘passStandar’:{$nin:["—"," “,”-","——","/",“无”,“ˉˉ”,"–","-—"]}}) -
根据id查询
db.getCollection(‘safe_chufa’).find({’_id’:ObjectId(“5bb0871cd13cb4b1d00fa16a”)}) -
查询多个条件,并统计
db.getCollection(‘ES_DATA’).find({‘menuId’:‘59b0c04facd75d73cbd01db1’,‘state’:‘2’}).count() -
查询不等于空格的数据
db.getCollection(‘zhuzuoquan’).find({‘postDate’:{$ne:’ '}})
----------------------------修改数据----------------------------
- 修改语句 :将这个menuId的state都改为0
db.getCollection(‘ES_DATA’).update({‘menuId’:‘59b0c056acd75d73cbd01ecd’,‘state’:‘2’},{$set:{‘state’:‘0’}},false,true)