mongodb工作记录

博客介绍了使用MongoDB的相关环境,包括jdk1.8、mongodb和eclipse,以及所需的mongo-java-driver-3.4.2.jar包。给出了MongoDBUtil中查询和修改数据的方法示例,还列举了多种查询语句,如按条件查询、多条件查询统计等,以及修改数据的语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境: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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值