一. 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 | 满足指定条件的任意一个 |