and or组合查询
- 构造BasicDBObject
BasicDBList andList = new BasicDBList();
BasicDBObject groupCond = new BasicDBObject();
groupCond.put("conversationID","GROUP" + groupId);
andList.add(groupCond);
if (LongUtil.isNotNullOrZero(id)) {
BasicDBObject msgIdCond = new BasicDBObject();
BasicDBObject ltCond = new BasicDBObject();
ltCond.put("$lt",id);
msgIdCond.put("msgId",ltCond);
andList.add(msgIdCond);
}
if (ArrayUtil.isNotEmptyOrNull(uids)) {
BasicDBList orList = new BasicDBList();
Iterator iterator = uids.iterator();
while (iterator.hasNext()) {
BasicDBObject uidCond = new BasicDBObject();
uidCond.put("from", iterator.next().toString());
orList.add(uidCond);
}
BasicDBObject orAll = new BasicDBObject();
orAll.put("$or", orList);
andList.add(orAll);
}
BasicDBObject andAll = new BasicDBObject();
andAll.put("$and",andList);
FindIterable<Map> result = getCollection().find(andAll,Map.class).sort(new BasicDBObject("msgId",-1)).limit(limit);
List<Map> list = new LinkedList<>();
Iterator<Map> iterator = result.iterator();
while (iterator.hasNext()) {
list.add(iterator.next());
}
- 构造query
Query query = new Query();
Criteria cond = Criteria.where("conversationID").is("GROUP" + groupId);
if (LongUtil.isNotNullOrZero(id)) {
cond.andOperator(Criteria.where("msgId").lt(id));
}
if (ArrayUtil.isNotEmptyOrNull(uids)) {
List<Criteria> criteria = new LinkedList<>();
Iterator iterator = uids.iterator();
while (iterator.hasNext()) {
criteria.add(Criteria.where("from").is(iterator.next().toString()));
}
cond.andOperator(new Criteria().orOperator(criteria.stream().toArray(Criteria[]::new)));
}
query.addCriteria(cond);
query.with(Sort.by(new Sort.Order(Sort.Direction.DESC, "msgId")));
FindIterable<Map> result = getCollection().find(query.getQueryObject(),Map.class).sort(query.getSortObject()).limit(limit);
List<Map> list = new LinkedList<>();
Iterator<Map> iterator = result.iterator();
while (iterator.hasNext()) {
list.add(iterator.next());
}