您的位置:首页 > 数据库 > Mongodb

play framework框架下,连接到MongoDB时的特殊操作(与或查询,模糊查询,范围查询,数据排序等)

2017-03-09 16:03 615 查看
现有班级信息表:

package models;

import play.modules.mongo.MongoEntity;
import play.modules.mongo.MongoModel;

/**
* Created by adinlead on 17/03/04.
*/
@MongoEntity("class_msg")
public class ClassMsg extends MongoModel {
public Integer class;   //班级号
public Integer number;   //学号
public String name;   //学生姓名
public Integer age; //年龄
}


1.与或查询

1.1与查询(类似于SQL中的AND)

没什么说的,这是最基本的

1.2或查询(类似于SQL中的OR)

在进行或查询时,需要将条件装入查询对象(com.mongodb.BasicDBObject)或者查询列表(com.mongodb.BasicDBList)

具体如下:

查询为一班的所有同学的或者叫”杨洛”或者姓名为”林雨”的同学:

BasicDBList params = new BasicDBList();
params.add(new BasicDBObject("name", "杨洛"));
params.add(new BasicDBObject("name", "林雨"));
List<ClassMsg> resultList = ClassMsg.find("byClassAnd$or",1,params).fetch();


2.模糊查询

在连接到Mongo进行模糊查询时,需要用到正则表达式

在这里 用java.util.regex.Pattern对象即可

具体如下:

查询杨姓同学

Pattern pattern = Pattern.compile("^杨.*$", Pattern.CASE_INSENSITIVE);
List<ClassMsg> resultList = ClassMsg.find("byName",pattern).fetch();


3.范围查询

范围查询相对简单,只需要用到com.mongodb.BasicDBObject对象

具体如下:

查询一班年龄大于等于20岁的同学

/**
大于使用:"$gt"
大于等于使用:"$gte"
小于使用:"$lt"
小于等于使用:"$lte"
不等于使用:"$ne"
其他情况可以去MongoDB教程中查询
**/
// 需要先声明条件
BasicDBObject param = new BasicDBObject("$gte",20)
List<ClassMsg> resultList = MongoModel.find("byAge",param).fetch();


X.排序

play framework框架的排序操作是在输入完成查询条件之后,在获得数据之前进行操作的.

注意,由于官方文件没写怎么正序倒序,于是我查了一下源代码,他是这样定义的:

如果在条件前加负号(‘-‘),则按该条件倒序排列,否则默认正序

具体如下:

按照学号排序

// 倒序排列
List<ClassMsg> resultList = MongoModel.find().order("by-number").fetch();
// 正序排列
List<ClassMsg> resultList = MongoModel.find().order("byNumber").fetch();


查询实例:

查询一班的杨姓或者年龄大于20岁的同学,并按照学号排序

BasicDBList params = new BasicDBList();
Pattern pattern = Pattern.compile("^杨.*$", Pattern.CASE_INSENSITIVE);
params.add(new BasicDBObject("name", pattern));
params.add(new BasicDBObject("age", new BasicDBObject("$gte",20)));
List<ClassMsg> resultList = ClassMsg.find("byClassAnd$or",1,params).order("byNumber").fetch();


附.

由于在实际生产环境中查询条件可能不固定,而MongoModel又不支持直接传入参数列表,故鄙人写了一了简陋的查询工具,望各位不要见笑:

为了提高一下各位的能力(其实是我懒),没写备注~

package utils;

import play.modules.mongo.MongoCursor;

import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* Created by adinlead on 16/11/04.
*/
public class MongoQuery {

public static MongoCursor doQuery(Class<?> clazz, String queryStr, Object[] params) {
try {
Object single = clazz.newInstance();
Method method = clazz.getDeclaredMethod("find", String.class, Array.newInstance(Object.class, 0).getClass());
return (MongoCursor) method.invoke(single, new Object[]{queryStr, params});
} catch (Exception e) {
return null;
}
}

public static MongoCursor doQuery(Class<?> clazz, String queryStr, List params) {
return doQuery(clazz, queryStr, params.toArray());
}

public static MongoCursor doQuery(Class<?> clazz, StringBuilder queryStr, List params) {
return doQuery(clazz, queryStr.toString(), params.toArray());
}

public static Long doCount(Class<?> clazz, String queryStr, Object[] params) {
try {
Object single = clazz.newInstance();
Method method = clazz.getDeclaredMethod("count", String.class, Array.newInstance(Object.class, 0).getClass());
return (Long) method.invoke(single, new Object[]{queryStr, params});
} catch (Exception e) {
return null;
}
}

public static Long doCount(Class<?> clazz, String queryStr, List params) {
return doCount(clazz, queryStr, params.toArray());
}

public static Long doCount(Class<?> clazz, StringBuilder queryStr, List params) {
return doCount(clazz, queryStr.toString(), params.toArray());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐