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