Home > OS >  How to return one random element by Query
How to return one random element by Query

Time:08-14

I'm trying to return random element in Spring using Query.

I have this:

@Override
public List<AdventureHolidays> findRandomTrekking() {
    Query query = new Query();
    query.addCriteria(Criteria.where("typeOfAdventureHolidays").is("trekking"));
    return mongoTemplate.find(query, AdventureHolidays.class);
}

But this return me all elements that match my criteria,

I tried with:

return mongoTemplate.findOne(query, AdventureHolidays.class); but then I have required type List provided AdventureHoliday

Also I was using and tried with this, but on this way elements appear twice sometimes:

@Aggregation(pipeline = {"{'$match':{'typeOfAdventureHolidays':'trekking'}}", "{$sample: 
{size:1}}"})

So I find a way with this Query, but its listing me all documents while I want just one random from collection

CodePudding user response:

After some discussion this is what OP asked for:

private static Queue<AdventureHolidays> elementsToReturn = new LinkedList<>();

public AdventureHolidays findRandomTrekking() {
  if (elementsToReturn.size() == 0) { //fetch data from db
    Query query = new Query(); 
    query.addCriteria(Criteria.where("typeOfAdventureHolidays")
         .is("trekking"));
    List<AdventureHolidays> newData = mongoTemplate.find(query, AdventureHolidays.class)
    Collections.shuffle(newData);
    elementsToReturn.addAll(newData);
  }
  return elementsToReturn.poll(); //this will crash if database is empty
}

Original answer.

You need to change return type of a method:

public AdventureHolidays findRandomTrekking() {
  Query query = new Query();
  query.addCriteria(Criteria.where("typeOfAdventureHolidays").is("trekking"));
  return mongoTemplate.findOne(query, AdventureHolidays.class);
}
  • Related