Как получить случайные документы с помощью spring mongorepository?

Предположим следующую структуру:

Класс пользователя:

public class User {

@Id
String id;
String name;
//...

}

Репозиторий пользователей:

public interface UserRepository extends MongoRepository<User, String> {

List<User> findByRandom(); // this method signature does not exist but would do what I intend to do

}

Пользовательский контроллер:

@Component
public class UserController {

    private UserRepository users;

      @Autowired
      public UserController(
          UserRepository users) {
        this.users= users;
      }

public List<User> getRandomUsers() {
return(users.findByRandom()); // limit is missing here
}

        }

Как можно было бы получить случайные документы из такой структуры. Наличие поля со случайным значением в документе не было бы желательным решением, поскольку значения всегда должны быть случайными (например, если я нажму случайное значение int 4 и получу x следующих элементов, они всегда будут одинаковыми). Также нежелательно запрашивать x раз, так как это будет слишком большая нагрузка. Кто-нибудь может помочь?

Заранее спасибо,

Кодехай


person Codehai    schedule 14.11.2017    source источник


Ответы (1)


Просто используйте этап $sample:

Через Spring-Data (начиная с версии 2.0):

SampleOperation matchStage = Aggregation.sample(5);
Aggregation aggregation = Aggregation.newAggregation(sampleStage);
AggregationResults<OutType> output = mongoTemplate.aggregate(aggregation, "collectionName", OutType.class);

Непосредственно через драйвер Java:

import static com.mongodb.client.model.Aggregates.*;
users.aggregate(Arrays.asList(sample(5)));
person dnickless    schedule 14.11.2017
comment
Можете ли вы дать более подробный ответ, поскольку агрегатный метод, похоже, не является частью базовых методов org.springframework.data.mongodb.repository.MongoRepository (метод throws не может разрешить), и у меня возникают проблемы с поиском примера поверх сеть - person Codehai; 14.11.2017
comment
Извините, здесь уже поздно - я почему-то не видел часть Spring, поэтому сначала просто дал стандартный ответ драйвера Java... - person dnickless; 14.11.2017
comment
К сожалению, это работает только с весенними данными 2.0 и выше. - person Codehai; 14.11.2017
comment
stackoverflow.com/questions/35976725 / - person dnickless; 14.11.2017