zoukankan      html  css  js  c++  java
  • Mongodb总结2-Java版本的HelloWorld-CRUD例子

      2013年,写的CRUD太简单了,今天在原来的基础上,稍微完善了下,用了更多语法,比如排序sort、in语句等。

      参考了《Mongodb权威指南-第1版-高清》,等下上传到CSDN下载频道,免积分下载。


      代码写得够清晰了,不再过多解释。


     

    package mongodb;
    
    import java.net.UnknownHostException;
    import java.util.Date;
    
    import com.mongodb.BasicDBList;
    import com.mongodb.BasicDBObject;
    import com.mongodb.CommandResult;
    import com.mongodb.DB;
    import com.mongodb.DBCollection;
    import com.mongodb.DBCursor;
    import com.mongodb.DBObject;
    import com.mongodb.Mongo;
    import com.mongodb.WriteResult;
    
    /**
     * MongoDB-CRUD Demo。
     * 
     * 
     */
    public class MongoDBDemo {
    	// /////////////数据库地址常量/////////////////////
    	/**
    	 * 数据库地址
    	 */
    	public static final String DEFAULT_HOST = "localhost";// localhost
    	/**
    	 * 端口号
    	 */
    	public static final int DEFAULT_PORT = 27017;
    	// //////////////数据库名称和集合常量/////////////////
    	/**
    	 * 数据库名称
    	 */
    	public static final String DB_BLOG = "blog";
    	/**
    	 * 集合名称
    	 */
    	public static final String DB_BLOG_COLLECTION = "article";
    
    	// /////////////文章Article的属性名称常量/////////////////////
    	/**
    	 * 标题
    	 */
    	public static final String TITLE = "title";
    	/**
    	 * 内容
    	 */
    	public static final String CONTENT = "content";
    	/**
    	 * 作者
    	 */
    	public static final String AUTHOR = "author";
    	/**
    	 * 日期
    	 */
    	public static final String DATE = "date";
    	public static final String ID = "id";
    
    	public static void main(String[] args) throws UnknownHostException {
    
    		Mongo mogo = new Mongo(DEFAULT_HOST, DEFAULT_PORT);
    		// 获得数据库
    		DB blogDb = mogo.getDB(DB_BLOG);
    		DBCollection articleCollection = blogDb
    				.getCollection(DB_BLOG_COLLECTION);
    
    		buildThreeArticles(articleCollection);
    
    		// 查找并打印作者为"FansUnion"的文章
    		BasicDBObject searchArticleByAuthor = new BasicDBObject();
    		searchArticleByAuthor.append(AUTHOR, "FansUnion");
    
    		demoFindByField(articleCollection, searchArticleByAuthor);
    		demoFindAndSort(articleCollection, searchArticleByAuthor);
    
    		BasicDBObject searchArticleById = new BasicDBObject();
    		searchArticleById.append(ID, 3L);
    		demoFindById(articleCollection, searchArticleById);
    
    		demoFindSpecialField(articleCollection, searchArticleById);
    
    		demoFindWithIn(articleCollection);
    
    		demoUpdateWithTwoWay(articleCollection, searchArticleByAuthor);
    
    		demoRemove(articleCollection);
    		// 集合中的文档数量
    		long count = articleCollection.count();
    		println("删除了刚刚新建的3条记录,剩余count=" + count);
    
    		// 关闭连接
    		mogo.close();
    	}
    
    	//删除数据
    	private static void demoRemove(DBCollection articleCollection) {
    		// 删除
    		BasicDBObject removeCondition = new BasicDBObject();
    		removeCondition.append(AUTHOR, "FansUnion");
    		articleCollection.remove(removeCondition);
    
    		BasicDBObject removeCondition2 = new BasicDBObject();
    		removeCondition.append(TITLE, "HelloWorld");
    		// 删除,并查看是否有报错
    		WriteResult writeResult = articleCollection.remove(removeCondition2);
    		CommandResult commandResult = writeResult.getLastError();
    		println("查看error信息,发现err字段为空" + commandResult.toString());
    
    		BasicDBObject removeAll = new BasicDBObject();
    		articleCollection.remove(removeAll);
    	}
    
    	//2种方式更新对象
    	private static void demoUpdateWithTwoWay(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		// 把标题为"HelloWorld"的文章的作者,修改为“小雷”
    		println("把标题为HelloWorld的文章的作者,修改为小雷,只修改AUTHOR1个字段");
    		// 查询条件:标题为"HelloWorld"
    		BasicDBObject updateCondition = new BasicDBObject();
    		searchArticleByAuthor.append(TITLE, "HelloWorld");
    
    		BasicDBObject newHelloWorldArticle = new BasicDBObject();
    		newHelloWorldArticle.append(AUTHOR, "小雷");
    
    		// 第1种方式-修改,只修改指定的字段("$set","$inc"都是修改器)
    		// update Article set author="小雷" where title='HelloWorld'
    		DBObject updateSetValue = new BasicDBObject("$set",
    				newHelloWorldArticle);
    		articleCollection.update(updateCondition, updateSetValue);
    		// 打印第1次修改过的"HelloWorld"文章
    		DBObject helloWordlArticle2 = articleCollection
    				.findOne(updateCondition);
    		print(helloWordlArticle2);
    
    		// 第2种方式-修改
    		// update Article set author="小雷",title=null,content=null,date=null
    		// where title='HelloWorld'
    		println("把标题为HelloWorld的文章的作者,修改为小雷,修改了所有的字段");
    		articleCollection.update(updateCondition, newHelloWorldArticle);
    		DBObject helloWordlArticle = articleCollection.findOne(updateCondition);
    		// 打印第2次修改过的"HelloWorld"文章
    		print(helloWordlArticle);
    	}
    
    	//Mongodb中的in语句
    	private static void demoFindWithIn(DBCollection articleCollection) {
    		// IN查询
    		println("查找并打印ID为1和2的文章");
    		// List list = Arrays.asList(1,2);
    		// Long[] array= new Long[]{1L,2L};
    
    		BasicDBList values = new BasicDBList();
    		values.add(1);
    		values.add(2);
    
    		DBObject inQuery = new BasicDBObject("$in", values);
    
    		DBObject con = new BasicDBObject();
    		con.put(ID, inQuery);
    		DBCursor cursorIdArray = articleCollection.find(con);
    		println("个数:" + cursorIdArray.count());
    		while (cursorIdArray.hasNext()) {
    			print(cursorIdArray.next());
    		}
    	}
    
    	//查询特定的字段
    	private static void demoFindSpecialField(DBCollection articleCollection,
    			BasicDBObject searchArticleById) {
    		println("查找并打印ID为3的文章2,只查询TITLE字段");
    		BasicDBObject b = new BasicDBObject();
    		b.append(TITLE, 1);
    		DBCursor cursor3 = articleCollection.find(searchArticleById, b);
    		println("个数:" + cursor3.count());
    		while (cursor3.hasNext()) {
    			print(cursor3.next());
    		}
    		// cursor3.close();//在没有这行代码的情况下,同样的程序,出现了1次,个数为4,仔细看,发现他们的内置ID不一样
    		// 可能是上一次执行的删除,还没有完成?
    		//这个地方是一个疑问,但是复现不了
    	}
    
    	//根据ID查找对象
    	private static BasicDBObject demoFindById(DBCollection articleCollection,
    			BasicDBObject searchArticleById) {
    		// 查找并打印ID为3的文章
    		println("查找并打印ID为3的文章");
    
    		DBCursor cursor2 = articleCollection.find(searchArticleById);
    		println("个数:" + cursor2.count());
    		while (cursor2.hasNext()) {
    			print(cursor2.next());
    		}
    		cursor2.close();
    		return searchArticleById;
    	}
    
    	//查找对象,并排序
    	private static void demoFindAndSort(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		// 查找并打印作者为"FansUnion"的文章,按照ID降序排列
    		println("查找并打印作者为FansUnion的文章,降序排列,查询出来的ID一次为3,2,1");
    		BasicDBObject orderByIdDesc = new BasicDBObject();
    		orderByIdDesc.append(ID, -1);
    		DBCursor cursorIdDesc = articleCollection.find(searchArticleByAuthor)
    				.sort(orderByIdDesc);
    		while (cursorIdDesc.hasNext()) {
    			print(cursorIdDesc.next());
    		}
    	}
    
    	//根据字段查找对象
    	private static void demoFindByField(DBCollection articleCollection,
    			BasicDBObject searchArticleByAuthor) {
    		println("查找并打印作者为FansUnion的文章,查询出来的ID一次为1,2,3");
    		DBCursor cursor = articleCollection.find(searchArticleByAuthor);
    		while (cursor.hasNext()) {
    			print(cursor.next());
    		}
    		cursor.close();// 网上和书中的的例子,没有关闭游标,官方JDK文档“kills the current cursor on
    						// the server.”
    	}
    
    	// 构造3个文章,插入的ID顺序是1,2,3
    	private static void buildThreeArticles(DBCollection articleCollection) {
    
    		BasicDBObject article = buildArticle("做好社会主义的接班人", "好好学习,天天向上",
    				"FansUnion", new Date(), 1L);
    		BasicDBObject article2 = buildArticle("做好资本主义的掘墓人", "拼命干活,时时向上",
    				"FansUnion", new Date(), 2L);
    		BasicDBObject article3 = buildArticle("HelloWorld",
    				"I am a MongoDb demo.", "FansUnion", new Date(), 3L);
    		// 增加若干文章
    		articleCollection.insert(article);
    		articleCollection.insert(article2);
    		articleCollection.insert(article3);
    
    		println("插入文章的个数:" + articleCollection.count());
    	}
    
    	// 打印对象
    	private static void print(DBObject article) {
    		// println("-----------------------");
    		println("内置ID:" + article.get("_id"));
    		println("标题:" + article.get(TITLE));
    		println("内容:" + article.get(CONTENT));
    		println("作者:" + article.get(AUTHOR));
    		println("日期:" + article.get(DATE));
    		println("ID:" + article.get(ID));
    		println("-----------------------");
    	}
    
    	private static void println(Object object) {
    		System.out.println(object);
    	}
    
    	/**
    	 * 构造1个文章对象
    	 * 
    	 * @param title
    	 *            标题
    	 * @param content
    	 *            内容
    	 * @param author
    	 *            作者
    	 * @param date
    	 *            日期
    	 * @return 文章对象
    	 */
    	private static BasicDBObject buildArticle(String title, String content,
    			String author, Date date, Long id) {
    		BasicDBObject article = new BasicDBObject();
    		article.append(TITLE, title);
    		article.append(CONTENT, content);
    		article.append(AUTHOR, author);
    		article.append(DATE, date);
    		article.append(ID, id);
    		return article;
    	}
    }

    代码执行结果

    插入文章的个数:3
    查找并打印作者为FansUnion的文章,查询出来的ID一次为1,2,3
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    查找并打印作者为FansUnion的文章,降序排列,查询出来的ID一次为3,2,1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    查找并打印ID为3的文章
    个数:1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:I am a MongoDb demo.
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:3
    -----------------------
    查找并打印ID为3的文章2,只查询TITLE字段
    个数:1
    内置ID:561baace3aea5b925fddc83e
    标题:HelloWorld
    内容:null
    作者:null
    日期:null
    ID:null
    -----------------------
    查找并打印ID为1和2的文章
    个数:2
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    内置ID:561baace3aea5b925fddc83d
    标题:做好资本主义的掘墓人
    内容:拼命干活,时时向上
    作者:FansUnion
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:2
    -----------------------
    把标题为HelloWorld的文章的作者,修改为小雷,只修改AUTHOR1个字段
    内置ID:561baace3aea5b925fddc83c
    标题:做好社会主义的接班人
    内容:好好学习,天天向上
    作者:小雷
    日期:Mon Oct 12 20:42:54 CST 2015
    ID:1
    -----------------------
    把标题为HelloWorld的文章的作者,修改为小雷,修改了所有的字段
    内置ID:561baace3aea5b925fddc83c
    标题:null
    内容:null
    作者:小雷
    日期:null
    ID:null
    -----------------------
    查看error信息,发现err字段为空{ "serverUsed" : "localhost/127.0.0.1:27017" , "n" : 1 , "connectionId" : 1 , "err" :  null  , "ok" : 1.0}
    删除了刚刚新建的3条记录,剩余count=0

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/qitian1/p/6462698.html
Copyright © 2011-2022 走看看