mongodb的简单使用二(结合springdata实现增删改查)

来源:互联网 发布:js正则表达式数字 编辑:程序博客网 时间:2024/05/17 13:43

结合springdata实现增删改查

          上一篇文章已经介绍了环境搭建和公用dao的实现,现在就来简单的说一下代码结构和简单的增删改查

         一、业务dao继承基础的mongodbDao(代码示例)
          
package com.glgd.recarticle.dao;import java.util.ArrayList;import java.util.List;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Order;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Repository;import com.glgd.recarticle.bean.ArticleComments;import com.glgd.recarticle.bean.ArticleSearchBean;import com.glgd.recarticle.domain.Article;import com.mongodb.MongoBaseDao;import com.util.StringUtil;@Repository(value="com.glgd.recarticle.dao.ArticleDao")public class ArticleDao extends MongoBaseDao<Article> {/** * 根据查询条件分页查询文章 * @param searchBean 查询 * @param skip 每页开始的位置 (skip:每一页开始位置;第一页第一条skip=0) * @param limit 每页的大小 * @return */public List<Article> findListBySearchBean(ArticleSearchBean searchBean,int skip,int limit){List<Article> list = null;Query query = new Query();Criteria criteria = new Criteria();//查询条件List<Criteria> list1 = new ArrayList<Criteria>();//contentType条件 加入ORList<Integer> clist = searchBean.getContentTypeList();if(null != clist){Criteria[] orArray = new Criteria[clist.size()];for(int i = 0; i < clist.size(); i++){orArray[i] = Criteria.where("contentType").is(clist.get(i));}list1.add(new Criteria().orOperator(orArray));}if(!StringUtil.isEmpty(searchBean.getArticleTitle())){list1.add(Criteria.where("articleTitle").regex(searchBean.getArticleTitle().trim()));}if(searchBean.getArticleStatus() != null){list1.add(Criteria.where("articleStatus").is(searchBean.getArticleStatus()));}if(!StringUtil.isEmpty(searchBean.getEditor())){list1.add(criteria = Criteria.where("editor").regex(searchBean.getEditor().trim()));}if(!StringUtil.isEmpty(searchBean.getArticleType())){list1.add( Criteria.where("articleType").is(searchBean.getArticleType()));}//只选择开始时间if(searchBean.getStartTime()!= null){list1.add(Criteria.where("publishDate").gte(searchBean.getStartTime().getTime()));}//只选择结束时间if(searchBean.getEndTime()!= null ){list1.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));}    //转换条件查询if(list1.size()>0){Criteria[] criteriaCondition = list1.toArray(new Criteria[list1.size()]);criteria.andOperator(criteriaCondition);query.addCriteria(criteria);}    query.skip(skip);      query.limit(limit);    query.sort().on("publishDate", Order.DESCENDING);        list = this.findByQuery(query, Article.class);     return list;}public long getCount(ArticleSearchBean searchBean){long count = 0;Query query = new Query();Criteria criteria = new Criteria();//查询条件List<Criteria> list = new ArrayList<Criteria>();//contentType条件 加入ORList<Integer> clist = searchBean.getContentTypeList();if(null != clist){Criteria[] orArray = new Criteria[clist.size()];for(int i = 0; i < clist.size(); i++){orArray[i] = Criteria.where("contentType").is(clist.get(i));}list.add(new Criteria().orOperator(orArray));}if(!StringUtil.isEmpty(searchBean.getArticleTitle())){list.add(Criteria.where("articleTitle").regex(searchBean.getArticleTitle().trim()));}if(searchBean.getArticleStatus() != null){list.add(Criteria.where("articleStatus").is(searchBean.getArticleStatus()));}if(!StringUtil.isEmpty(searchBean.getEditor())){list.add(Criteria.where("editor").regex(searchBean.getEditor().trim()));}if(!StringUtil.isEmpty(searchBean.getArticleType())){list.add( Criteria.where("articleType").is(searchBean.getArticleType()));}//只选择开始时间if(searchBean.getStartTime()!= null){list.add(Criteria.where("publishDate").gte(searchBean.getStartTime().getTime()));}//只选择结束时间if(searchBean.getEndTime()!= null ){list.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));}    //转换条件查询if(list.size()>0){Criteria[] criteriaCondition = list.toArray(new Criteria[list.size()]);criteria.andOperator(criteriaCondition);query.addCriteria(criteria);}count = this.getCount(query, Article.class);return count;}/** * 新增评论 * @param _id * @param comments */public void addComments(String _id,ArticleComments comments){Query query = Query.query(Criteria.where("_id").is(_id));Update update = new Update();        update.addToSet("comments", comments);        this.updateFirst(query, update, Article.class);}/** * 根据条件获取文章下的评论 * @param searchBean * @param skip * @param pageSize * @return */   public List<Article> getAllComments(ArticleSearchBean searchBean){    Query query = new Query();query.fields().include("comments");Criteria criteria = new Criteria();//查询条件List<Criteria> listCriteria = new ArrayList<Criteria>();if(!StringUtil.isEmpty(searchBean.getUseName())){listCriteria.add(Criteria.where("comments.userName").regex(searchBean.getUseName().trim()));}if(!StringUtil.isEmpty(searchBean.getKeyWord())){listCriteria.add(Criteria.where("comments.content").regex(searchBean.getKeyWord().trim()));}if(searchBean.getCommentDate()!= null){listCriteria.add(Criteria.where("comments.commentTime").lt(searchBean.getCommentDate().getTime()+(3600*1000*24L)));listCriteria.add(Criteria.where("comments.commentTime").gte(searchBean.getCommentDate().getTime()));} //转换条件查询if(listCriteria.size()>0){Criteria[] criteriaCondition = listCriteria.toArray(new Criteria[listCriteria.size()]);criteria.andOperator(criteriaCondition);query.addCriteria(criteria);}List<Article> articleList = this.findByQuery(query, Article.class);    return articleList;   }      /**    * 删除评论的内嵌文档    * @param userId    * @param commentTime    * @param _id    */   public void deleteComment(long userId,long commentTime,String _id){   Query query = Query.query(Criteria.where("comments.userId").is(userId).and("comments.commentTime").is(commentTime).and("_id").is(_id));       Update update = new Update();       update.unset("comments.$");       this.updateFirst(query, update, Article.class);       this.deleteNULLcomment(_id);   }      /**    * 清空评论中的null并且评论数-1    * @param _id    */   public void deleteNULLcomment(String _id){   Query query = Query.query(Criteria.where("_id").is(_id));       Update update = new Update();       update.pull("comments", null);       update.inc("commentCount", -1);       this.updateFirst(query, update, Article.class);   }      /**    * 更新文章信息    * @param article    */   public void updateArticle(Article article){   Query query = Query.query(Criteria.where("_id").is(article.get_id()));   Update update = new Update();   update.set("articleTitle", article.getArticleTitle());       update.set("articleType", article.getArticleType());       update.set("editor", article.getEditor());       update.set("articleStatus", article.getArticleStatus());       update.set("publishDate", article.getPublishDate());       update.set("sortFlag", article.getSortFlag());       update.set("rcoverImage", article.getRcoverImage());       update.set("overview", article.getOverview());       update.set("articleDetail", article.getArticleDetail());       update.set("contentType", article.getContentType());       update.set("sconverImage", article.getSconverImage());       this.updateFirst(query, update, Article.class);   }      /**    * 根据文章主键删除文章    * @param _id    */   public void deleteArticleById(String _id){   Query query = Query.query(Criteria.where("_id").is(_id));   this.delete(query, Article.class);   }   /** * 删除评论时,更新评论数 * @param _id * @param comments */public void updateCommentCount(String _id,int size){Query query = Query.query(Criteria.where("_id").is(_id));Update update = new Update();        update.inc("commentCount", -size);        this.updateFirst(query, update, Article.class);}/** * 添加和删除收藏时更新收藏次数 * @param _id * @param size */public void updateCollectCount(String _id,int size){Query query = Query.query(Criteria.where("_id").is(_id));Update update = new Update();        update.inc("collectCount", size);        this.updateFirst(query, update, Article.class);}/** * 更新浏览次数 * @param _id * @param size */public void updateBrowseCount(String _id,int size){Query query = Query.query(Criteria.where("_id").is(_id));Update update = new Update();        update.inc("scanCount", size);        this.updateFirst(query, update, Article.class);}}

二、对于Dao中对数据库集合的操作总结:
     
       1、查询 :查询语句(注意事不能有多个Or和and--->new Criteria().and("").is("").orOperator(criteria).is(""))类似这样的操作查询时是会报错的,所以改为如下方式:

                        
Query query = new Query();Criteria criteria = new Criteria();//查询条件List<Criteria> list1 = new ArrayList<Criteria>();//contentType条件 加入ORList<Integer> clist = searchBean.getContentTypeList();if(null != clist){Criteria[] orArray = new Criteria[clist.size()];for(int i = 0; i < clist.size(); i++){orArray[i] = Criteria.where("contentType").is(clist.get(i));}list1.add(new Criteria().orOperator(orArray));}
//只选择结束时间if(searchBean.getEndTime()!= null ){list1.add(Criteria.where("publishDate").lt(searchBean.getEndTime().getTime()));}    //转换条件查询if(list1.size()>0){Criteria[] criteriaCondition = list1.toArray(new Criteria[list1.size()]);criteria.andOperator(criteriaCondition);query.addCriteria(criteria);}    query.skip(skip);      query.limit(limit);    query.sort().on("publishDate", Order.DESCENDING);        list = this.findByQuery(query, Article.class);
                                        
                       a).模糊匹配:Criteria.where("articleTitle").regex(searchBean.getArticleTitle().trim())   regex方法用来进行模糊匹配,类似于 sql 的like;
                       
                       b). 内嵌文档查询:结合图片中
                       
                     
                       根据条件查询type(内嵌文档查询):代码示例如下
               if(!StringUtil.isEmpty(paramBean.getPtype())){listCriteria.add(Criteria.where("type.ptype").is(paramBean.getPtype()));}if(!StringUtil.isEmpty(paramBean.getFtype())){listCriteria.add(Criteria.where("type.fctype").is(paramBean.getFtype()));}
                      
                          c).分页查询:
              query.skip(skip);  <span></span>    query.limit(limit);
             
                        d).查询结果排序:  org.springframework.data.mongodb.core.query.Order   
             query.sort().on("publishDate", Order.DESCENDING);
                         
                        e).对内嵌文档切片查询:由于我在springdata 框架中没有找到对应的api所以自己,写了一个简单的示例,可以结合示例灵活应用。数据结构图
                        
                            
             //关于内嵌文档 的 切片查询    public static void main(String[] args) throws UnknownHostException {Mongo mogo = new Mongo("127.0.0.1",27017);DB db  = mogo.getDB("authTest");DBCollection successCard = db.getCollection("successCard");successCard.rename("successCard_20160112");BasicDBObject query = new BasicDBObject("_id", new ObjectId("5694b1ef977dfabb53a16d51"));BasicDBObject fields = new BasicDBObject(  "commentList",  new BasicDBObject("$slice", new int[] { 1, 3 }));DBCursor resultsCursor = successCard.find(query, fields);while(resultsCursor.hasNext()){System.out.println(resultsCursor.next().toMap().get("commentList"));}    }











0 0
原创粉丝点击