ホームページ > Java > &#&チュートリアル > Java での mongodb 操作クエリのさまざまな例を共有する

Java での mongodb 操作クエリのさまざまな例を共有する

黄舟
リリース: 2017-09-25 10:38:16
オリジナル
1794 人が閲覧しました

这篇文章主要介绍了java 中mongodb的各种操作查询的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

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

一. 常用查询:

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


1

2

3

public PageUrl getByUrl(String url) {

    return findOne(new Query(Criteria.where("url").is(url)),PageUrl.class);

  }

ログイン後にコピー

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


1

2

3

4

5

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


1

2

3

4

5

6

7

8

9

10

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中数据类型一致


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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


1

2

3

4

5

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


1

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

ログイン後にコピー

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


1

2

Criteria criteria = new Criteria();

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

ログイン後にコピー

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


1

2

3

4

5

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的语句


1

2

3

4

5

6

7

8

9

10

var s = {

    key1: value1,

    key2: {

      keyA: valueA,

      keyB: valueB

    }

  };

  

@Query("{&#39;key2.keyA&#39;:?0}")

List<Asset> findAllBykeyA(String keyA);

ログイン後にコピー

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


1

2

3

4

5

6

7

8

9

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


1

2

3

4

5

6

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. 更新一条数据的一个字段:


1

2

3

4

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. 更新一条数据的多个字段:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//调用更新

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. 删除数据:


1

2

3

public void deleteObject(Class<T> clazz,String id) {

    remove(new Query(Criteria.where("id").is(id)),clazz);

  }

ログイン後にコピー

9.保存数据:


1

2

3

4

5

6

7

8

9

10

11

//插入一条数据

  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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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;

}

ログイン後にコピー

以上がJava での mongodb 操作クエリのさまざまな例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
Mac での mongodb の構成エラー
から 1970-01-01 08:00:00
0
0
0
symfony2 mongodb の使用
から 1970-01-01 08:00:00
0
0
0
mongodbのパラメータの理解
から 1970-01-01 08:00:00
0
0
0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート