java 中mongodb的各种操作查询的实例详解

java 中mongodb的各种操作查询的实例详解

一. 常用查询:

1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...)

  public PageUrl getByUrl(String url) {
      return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class);
    }

2. 查询多条数据:linkUrl.id 属于分级查询

  public List<PageUrl> getPageUrlsByUrl(int begin, int end,String linkUrlid) {
      Query query = new Query();
      query.addCriteria(Criteria.where("linkUrl.id").is(linkUrlid));
      return find(query.limit(end - begin).skip(begin), PageUrl.class);
    }

3.模糊查询:-----关键字---regex

 public long getProcessLandLogsCount(List<Condition> conditions)
    {
      Query query = new Query();
      if (conditions != null && conditions.size() > 0) {
        for (Condition condition : conditions) {
          query.addCriteria(Criteria.where(condition.getKey()).regex(".*?\\" +condition.getValue().toString()+ ".*"));
        }
      }
      return count(query, ProcessLandLog.class);
    }

最下面,我在代码亲自实践过的模糊查询,只支持字段属性是字符串的查询,你要是查字段属性是int的模糊查询,还真没辙。

4.gte: 大于等于,lte小于等于...注意查询的时候各个字段的类型要和mongodb中数据类型一致

 public List<ProcessLandLog> getProcessLandLogs(int begin,int end,List<Condition> conditions,String orderField,Direction direction)
    {
      Query query = new Query();
      if (conditions != null && conditions.size() > 0) {
        for (Condition condition : conditions) {
          if(condition.getKey().equals("time")){
            query.addCriteria(Criteria.where("time").gte(condition.getValue())); //gte: 大于等于
          }else if(condition.getKey().equals("insertTime")){
            query.addCriteria(Criteria.where("insertTime").gte(condition.getValue()));
          }else{
            query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue()));
          }
        }
      }
      return find(query.limit(end - begin).skip(begin).with(new Sort(new Sort.Order(direction, orderField))), ProcessLandLog.class);
    } 

  public List<DpsLand> getDpsLandsByTime(int begin, int end, Date beginDate,Date endDate) {
   return find(new Query(Criteria.where("updateTime").gte(beginDate).lte(endDate)).limit(end - begin).skip(begin),
    DpsLand.class);
   }

查询字段不存在的数据 -----关键字---not

public List<GoodsDetail> getGoodsDetails2(int begin, int end) {
      Query query = new Query();
      query.addCriteria(Criteria.where("goodsSummary").not());
      return find(query.limit(end - begin).skip(begin),GoodsDetail.class);
    }

查询字段不为空的数据     -----关键字---ne

  Criteria.where("key1").ne("").ne(null)

查询或语句:a || b     ----- 关键字---orOperator

 Criteria criteria = new Criteria();
  criteria.orOperator(Criteria.where("key1").is("0"),Criteria.where("key1").is(null));

查询且语句:a && b     ----- 关键字---and

  Criteria criteria = new Criteria();
  criteria.and("key1").is(false);
  criteria.and("key2").is(type);
  Query query = new Query(criteria);
  long totalCount = this.mongoTemplate.count(query, Xxx.class);

查询一个属性的子属性,例如:查下面数据的key2.keyA的语句

  var s = {
      key1: value1,
      key2: {
        keyA: valueA,
        keyB: valueB
      }
    }; 

  @Query("{'key2.keyA':?0}")
  List<Asset> findAllBykeyA(String keyA);

5. 查询数量:----- 关键字---count

 public long getPageInfosCount(List<Condition> conditions) {
      Query query = new Query();
      if (conditions != null && conditions.size() > 0) {
        for (Condition condition : conditions) {
          query.addCriteria(Criteria.where(condition.getKey()).is(condition.getValue()));
        }
      }
      return count(query, PageInfo.class);
    }

查找包含在某个集合范围:----- 关键字---in

  Criteria criteria = new Criteria();
  Object [] o = new Object[]{0, 1, 2}; //包含所有
  criteria.and("type").in(o);
  Query query = new Query(criteria);
  query.with(new Sort(new Sort.Order(Direction.ASC, "type"))).with(new Sort(new Sort.Order(Direction.ASC, "title")));
  List<WidgetMonitor> list = this.mongoTemplate.find(query, WidgetMonitor.class);

6. 更新一条数据的一个字段:

  public WriteResult updateTime(PageUrl pageUrl) {
      String id = pageUrl.getId();
      return updateFirst(new Query(Criteria.where("id").is(id)),Update.update("updateTime", pageUrl.getUpdateTime()), PageUrl.class);
    }

7. 更新一条数据的多个字段:

  //调用更新
  private void updateProcessLandLog(ProcessLandLog processLandLog,
        int crawlResult) {
      List<String> fields = new ArrayList<String>();
      List<Object> values = new ArrayList<Object>();
      fields.add("state");
      fields.add("result");
      fields.add("time");
      values.add("1");
      values.add(crawlResult);
      values.add(Calendar.getInstance().getTime());
      processLandLogReposity.updateProcessLandLog(processLandLog, fields,
          values);
    }
  //更新
  public void updateProcessLandLog(ProcessLandLog land, List<String> fields,List<Object> values) {
      Update update = new Update();
      int size = fields.size();
      for(int i = 0 ; i < size; i++){
        String field = fields.get(i);
        Object value = values.get(i);
        update.set(field, value);
      }
      updateFirst(new Query(Criteria.where("id").is(land.getId())), update,ProcessLandLog.class);
    }

8. 删除数据:

  public void deleteObject(Class<T> clazz,String id) {
      remove(new Query(Criteria.where("id").is(id)),clazz);
    }

9.保存数据:

//插入一条数据
  public void saveObject(Object obj) {
      insert(obj);
    } 

  //插入多条数据
  public void saveObjects(List<T> objects) {
      for(T t:objects){
        insert(t);
      }
    }

我自己使用的例子:

下面例子涉及到:

精确查询:is;

模糊查询:regex;

分页查询,每页多少:skip,limit

按某个字段排序(或升或降):new Sort(new Sort.Order(Sort.Direction.ASC, "port"))

查询数量:count

  public Map<String, Object> getAppPortDetailByPage(int pageNo, int pageSize, String order, String sortBy, String appPortType, String appPortSeacherName) {
    Criteria criteria = new Criteria();
    if (!appPortType.equals("")) {
      if (!appPortType.equals("all")) {
        //DB表里的字段----appmanageType
        //下同 port protocol 也是DB表的字段
        criteria.and("appmanageType").is(appPortType);
      }
    }
    if (!appPortSeacherName.equals("")) {
      try {
        criteria.orOperator(Criteria.where("port").is(Integer.parseInt(appPortSeacherName)),
            Criteria.where("protocol").regex(".*?" + appPortSeacherName + ".*"));
      }catch (Exception e){
        criteria.orOperator(Criteria.where("protocol").regex(".*?" + appPortSeacherName + ".*"));
      }
    }
    Map<String, Object> result = Maps.newHashMap();
    Query query = new Query(criteria);
    query.skip((pageNo - 1) * pageSize);
    query.limit(pageSize);
    if(order != null && sortBy != null){
      query.with(new Sort(new Sort.Order(order.equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, sortBy)));
    }else {
      query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "port")));
    }
    List<Appportmanage> list = this.mongoTemplate.find(query, Appportmanage.class);
    long count = this.mongoTemplate.count(query, Appportmanage.class);
    result.put("datas", list);
    result.put("size", count);
    return result;
  }

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • mongodb聚合_动力节点Java学院整理

    今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一:聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样. <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图. <3> group 在mongodb里面做group操作有点小

  • java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且

  • Java操作Mongodb数据库实现数据的增删查改功能示例

    本文实例讲述了Java操作Mongodb数据库实现数据的增删查改功能.分享给大家供大家参考,具体如下: 首先,我们在windows下安装mongodb数据库,安装教程可查看前面一篇文章:http://www.jb51.net/article/85605.htm 代码如下: package io.mogo; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.mongodb.BasicDBObj

  • MongoDB快速入门笔记(八)之MongoDB的java驱动操作代码讲解

    MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个). 下面代码给大家介绍MongoDB的java驱动操作,具体代码如下所示: import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.bson.Document; import com.mongodb.MongoClient; impo

  • mongodb运维_动力节点Java学院整理

    我们以管理员的视角来看mongodb,作为一名管理员,我们经常接触到的主要有4个方面: 1.  安装部署 2.  状态监控 3.  安全认证 4.  备份和恢复, 下面我们就一点一点的讲解. 一:安装部署 我之前的文章都是采用console程序来承载,不过在生产环境中这并不是最佳实践,谁也不愿意在机器重启后满地找牙似找mongodb,在mongodb里面提供了一个叫做"服务寄宿"的模式,我想如果大家对wcf比较熟悉的话很容易听懂.好了,我们实践一下,这里我开一下D盘里面的mongodb

  • mongodb增删改查详解_动力节点Java学院整理

    仔细观察"划线区域"的信息,发现db文件夹下有一个类似的"lock file"阻止了mongodb的开启,接下来我们要做的就是干掉它,之后,开启成功,关于mongodb的管理方式将在后续文章分享. 一: Insert操作 上一篇也说过,文档是采用"K-V"格式存储的,如果大家对JSON比较熟悉的话,我相信学mongodb是手到擒来,我们知道JSON里面Value 可能是"字符串",可能是"数组",又有可能是

  • Mongodb3.0.5 副本集搭建及spring和java连接副本集配置详细介绍

    Mongodb3.0.5 副本集搭建及spring和java连接副本集配置详细介绍 一.基本环境: mongdb3.0.5数据库 spring-data-MongoDB-1.7.2.jar mongo-Java-driver-3.0.2.jar Linux-redhat6.3 tomcat7 二.搭建mongodb副本集: 1.  分别在三台linux系统机上安装mongodb,(为避免和机器上原有的mongodb端口冲突,这里设为57017): 192.168.0.160 192.168.0.

  • Java连接MongoDB进行增删改查的操作

    Java连接MongoDB进行增删改查的操作 1.创建数据库的连接,进行增删改查 (分别为接口和实现类) package com.dao; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mo

  • java 中mongodb的各种操作查询的实例详解

    java 中mongodb的各种操作查询的实例详解 一. 常用查询: 1. 查询一条数据:(多用于保存时判断db中是否已有当前数据,这里 is  精确匹配,模糊匹配 使用regex...) public PageUrl getByUrl(String url) { return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class); } 2. 查询多条数据:linkUrl.id 属于分级查询 public Lis

  • thinkphp中的多表关联查询的实例详解

    thinkphp中的多表关联查询的实例详解 在进行后端管理系统的编程的时候一般会使用框架来进行页面的快速搭建,我最近使用比较多的就是thinkphp框架,thinkphp框架的应用其实就是把前端和后端进行分割管理,前端用户登录查询系统放在thinkphp中的home文件夹中进行管理,后端管理系统放在thinkphp中的admin文件夹中进行管理.对了,在使用thinkphp框架的时候是是要用到mvc架构的,mvc架构就是model(数据模型).view(视图).controller(控制器)的结

  • java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. 基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差

  • java中构造方法及this关键字的用法实例详解(超详细)

    目录 初识构造方法 构造方法的使用 初识this this.xx的用法 this()用于构造函数的调用 总结 初识构造方法 我们上篇讲了java中类的创建,那么让我们来实战演练一下:创建一个学生类,里面有学生的基本信息,包括姓名.性别.年龄.学号,你可能会写出这样的代码: class Student { String name; String gender; int age; long studentID; } public class TestDemo2 { public static voi

  • Java中分割字符串的两种方法实例详解

    前言 相信大家应该都知道在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串,这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作.下面这篇文章就给大家分享了两种分割的方法,下面来一起看看吧. 一.java.lang.String 的 split() 方法, JDK 1.4 or later public String[] split(String regex,int limit) 示例代码 public class StringSpl

  • Java中JDBC实现动态查询的实例详解

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语句的构成 一旦用户向查询条件中输入数据,该查询条件就成为最终条件的一部分. 二 基本原理 1.SQL基本框架 无论查询条件如何,查询字段与数据库是固定不变的,这些固定不变的内容构成SQL语句的基本框架,如 select column... from table. 2.StringBuilder形成D

  • 基于Java中最常用的集合类框架之HashMap(详解)

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性

  • Java中关于二叉树的概念以及搜索二叉树详解

    目录 一.二叉树的概念 为什么要使用二叉树? 树是什么? 树的相关术语! 根节点 路径 父节点 子节点 叶节点 子树 访问 层(深度) 关键字 满二叉树 完全二叉树 二叉树的五大性质 二.搜索二叉树 插入 删除 hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二叉排序树)讲一下.我们直接进入正题吧!GitHub源码链接 一.二叉树的概念 为什么要使用二叉树? 为什么要用到树呢?因为它通常结合了另外两种数据结

  • Java Mybatis框架多表操作与注解开发详解分析

    目录 一对一查询 多对多查询 Mybatis的注解开发 Mybatis的增删查改 MyBatis的注解实现复杂映射开发 一对一查询 一对一查询的模型 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户. 一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户 一对一查询的语句 对应的sql语句: select * from orders o,user u where o.uid=u.id;查询的结果如下: 创建Order和User实体 创建OrderMapper接口 p

随机推荐