java使用mangodb进行多条件组合查询

and or组合查询

  1. 构造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());
        }
  1. 构造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());
    }

你可能感兴趣的:(MongoDB)