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

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

 

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 ++) {
            DBRefnewDBRef(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所以后边的第二个参数肯定就是一个数组或者集合.

 

四.             Mongo中QueryOperators的使用

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

那么是如何使用 多呢?

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

满足指定条件的任意一个