1. 程式人生 > >mongodb的簡單使用二(結合springdata實現增刪改查)

mongodb的簡單使用二(結合springdata實現增刪改查)

          
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條件 加入OR
		List<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條件 加入OR
		List<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);
	}
}