Mongo的高级查询

一.             Mongo中插入数组或者集合

1.        Mongo中很正常会看到这样的数据。

Mongo的高级查询 - Paul - Its my life
 

userCollection是一个类似数组的数据类型。

这是如何做到的呢?

二.             如果向mongo中插入数组。

(1)     实际上很简单,既然值是一个数组,那么我们就创建一个数组,然后往数组中添加值,当然这边的值都是一些对象引用。

(2)     对象引用概念:就如关系型数据库中主键和外键的关系,只不过mongo中的对象引用是通过对象DBRef来实现的。

(3)     Mongo中的主键都是”_id”,并且是由ObjectId对象产生的。

例如:

DBObject obj = new BasicDBObject();

        obj.put("_id"new ObjectId());

(4)     实例:User表中的的classId肯定是一个对象引用,引用来自class表中的classId主键。我们可以这样来引用:DBRef  d = new DBRef(classId);

注意:这时候的classId这一列就不是String类型的了,而是对象类型的了。

1.        Mongo中插入数组实现的代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User2");

        DBObject field = new BasicDBObject();

        Object[] array = new Object[5];

        for(int i = 0; i < array.length; i ++) {

            DBRef ref = new DBRef(basicDao.getDB(), "User2"newObjectId());

            array[i] = ref;

        }

        field.put("userCollection", array);

        coll.save(field);

2.        mongo中插入集合

Mongo中插入集合实现的代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        DBObject field = new BasicDBObject();

        List<DBRef> list = new ArrayList<DBRef>();

        for(int i = 0; i < 5; i ++) {

            DBRef ref = new DBRef(basicDao.getDB(), "User"newObjectId());

            list.add(ref);

        }

        field.put("userCollection", list);

        coll.save(field);

 

3.        查询数组或者集合中的每一个元素.

(1)     现在大家都知道mongo中插入数组是啥回事的了,但是现在又遇到一个问题,如何查询这些数组里面的每一个元素?

(2)     这个不由的让我想到了反射机制,因为我们根本不知道用户插入的时候插入的是数组还是集合,但是可以肯定这两个类型不一样。

(3)     代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User2");

        DBObject query = new BasicDBObject();

        query.put("_id"new ObjectId("4e12e3c3912b22d362bdc022"));

        DBObject user = coll.findOne(query);

        if(user != null) {

            Object userCollection = user.get("userCollection");

            if(userCollection instanceof List) {

                List<DBRef> refList = new ArrayList<DBRef>();

                List list = (List)userCollection;

                for(Object obj : list) {

                    if(obj instanceof DBRef) {

                        DBRef ref = (DBRef)obj;

                        refList.add(ref);

                    }

                }

                System.out.println("userCollection  type  is List");

                System.out.println("refList's  size:  " + refList.size());

            }

            if(userCollection instanceof Object[]) {

                List<DBRef> refList = new ArrayList<DBRef>();

                Object[] array = (Object[])userCollection;

                for(Object obj : array) {

                    if(obj instanceof DBRef) {

                        DBRef ref = (DBRef)obj;

                        refList.add(ref);

                    }

                }

                System.out.println("userCollection  type  is Object");

                System.out.println("refList's  size:  " + refList.size());

            }

        }

 

三.             Mongo中模糊查询

1.        Mongo中模糊查询实现的原理。

我们大多数人都是接触过SQL语句的,也都知道SQL语句中的模糊查询的概念(%key%),这边就不多解释了,而mongo中是如何来使用mongo的呢?

Mongo中当然没这么的智能了,它的实现的原理就是通过正则表达式来实现的。

也就是java中的Pattern对象。

2.        提出的新的需求。

现在数据库中的表的结构如下:

 

现在我想查询name中含有xiaoliang的所有的对象,如果我们用以前的方法来做的话肯定是不行的。因为以前我们查询的思路是这样的,代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        DBObject query = new BasicDBObject();

        query.put("name""xiaoliang");

        DBCursor cursor = coll.find(query);

        System.out.println(cursor.size());

为什么不行呢?这个查询是查找表中name字段为xiaoliang的对象,当然不行了。

这时我们就必须使用支持模糊匹配的Pattern对象。

修改之后的代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        DBObject query = new BasicDBObject();

        String params = "xiao";

        Pattern pattern = Pattern.compile(params, Pattern.CASE_INSENSITIVE);

        query.put("name", pattern);

        DBCursor cursor = coll.find(query);

        System.out.println(cursor.size());

这时候就可以查询出name中有xiaoliang的对象了。

3.        这时又提出了一个新的需求,现在我不知道里面有没有xiaoliang,也有是可能包含xiaoxiao的,那这样怎么办呢?

实现的思路:

(1)     这时我们想到了,在刚才的params中加一个或的或的运算符。

代码如下:

String  params  =  “xiaoliang|xiaoxiao”;

这样就可以实现了。

(2)     当然下面介绍一个新的对象QueryOperators,可以使用这个对象中的in属性实现上面的问题。

实现代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        String[] params = new String[]{"xiaoxiao""xiaoliang"};

        BasicDBObject query = new BasicDBObject();

        query.put(QueryOperators.IN, params);

        BasicDBObject result = new BasicDBObject();

        result.put("name", query);

        DBCursor cursor = coll.find(result);

        System.out.println(cursor);

        System.out.println(cursor.count());

我们可以通过QueryOperators对象中的in实现,既然是in所以后边的第二个参数肯定就是一个数组或者集合.

 

四.             MongoQueryOperators的使用

1.        QueryOperators有点像一个Math对象,看看它的一些值,从字面上去理解,GTGTELTLTE,就是大于、大于等于、小于、小于等于。其他的看帮助文档。

那么是如何使用 多呢?

2.        GT的使用:

大小的比较都是数值类型的比较,不存在字符的比较。

我想查询age>25的所有对象:

实现代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        BasicDBObject query = new BasicDBObject();

        query.put(QueryOperators.GT, 25);

        BasicDBObject result = new BasicDBObject();

        result.put("age", query);

        DBCursor cursor = coll.find(result);

        System.out.println(cursor);

        System.out.println(cursor.count());

这行代码是重点,其余的三个的使用和这个差不多。

 

3.        新的需求,我想查age>25&&age<=30的所有对象。

“>”应该用”GT””<=”应该用”LTE”

实现代码如下:

BasicDao basicDao = new BasicDao();

        DBCollection coll = basicDao.getDBCollection("User");

        BasicDBObject query = new BasicDBObject();

        query.put(QueryOperators.GT, 25);

        query.put(QueryOperators.LTE, 30);

        BasicDBObject result = new BasicDBObject();

        result.put("age", query);

        DBCursor cursor = coll.find(result);

        System.out.println(cursor);

        System.out.println(cursor.count());

 

4.        不使用QueryOperators对象,也可以实现上面功能。

当然这里的只不过是QueryOperators.GT的另外一种形式罢了。可以替换为$gt,其他的分别是”$gte””$LT””$LTE”

修改的代码如下:

query.put("$gte", 25);

        query.append("$lte", 30);

 

五.             大致上说一下QueryOperators中的属性的意思。

属性名

大致的含义

$all

满足所有的指定条件

$exists

不满足指定条件

$gt,$gte,$lt,$lte

大于、大于等于、小于、小于等于

$in

满足指定条件的任意一个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值