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