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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/PYXLY1314/article/details/48782773

结合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条件 加入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);
	}
}

二、对于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条件 加入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(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"));
		}
	    }











猜你喜欢

转载自blog.csdn.net/PYXLY1314/article/details/48782773