spring-data-mongodb-1.8.4 has a great package , with some features that makes mongodb queries easy. Unfortunately, documentation on this topic is not very good. I'll contribute to it by short example.
Problem
We want to search mongodb using $and and $in keyword based on several fields. But we don't know field configuration beforehead. Input params are fit into domain class:
public class MakeModelYear { private String[] make; private String[] model; private String[] year; public MakeModelYear(String[] make, String[] model, String[] year) { this.make = make; this.model = model; this.year = year; } public String[] getMake() { return make; } public String[] getModel() { return model; } public String[] getYear() { return year; } public boolean isEmpty() { return isEmpty(model) && isEmpty(make) && isEmpty(year); } public static boolean isEmpty(String[] a) { return a == null || a.length ==0; } }
Any of make model and year can be null, and we still need to have nice smooth functionality
For Query itself object:
As you can see, we can specify both Criteria and configuration what to return and what to supress in one readable object.
I could not find better way in Jongo and mongo driver.
Solution
For Criteria object:public static Criteria generateQuery(MakeModelYear key) { Queuecril = new ArrayDeque<>(); if (!MakeModelYear.isEmpty(key.getMake())) { Criteria makeCri = Criteria.where("Make").in(Arrays.asList(key.getMake())); cril.add(makeCri); } if (!MakeModelYear.isEmpty(key.getModel())) { Criteria modelCri = Criteria.where("Model").in(Arrays.asList(key.getModel())); cril.add(modelCri); } if (!MakeModelYear.isEmpty(key.getYear())) { Criteria yearCri = Criteria.where("Year").in(Arrays.asList(key.getYear())); cril.add(yearCri); } return cril.size() == 1 ? cril.poll() : cril.poll().andOperator(cril.toArray(new Criteria[]{})); }
For Query itself object:
MakeModelYear key = new MakeModelYear(make, model, year); Query query = new Query(); if(!key.isEmpty())query.addCriteria(DaoHelper.generateQuery(key)); query.fields().exclude("_id"); return mongoTemplate.getCollection(CARS).find(query.getQueryObject(), query.getFieldsObject()).toArray();
As you can see, we can specify both Criteria and configuration what to return and what to supress in one readable object.
I could not find better way in Jongo and mongo driver.
No comments:
Post a Comment