Как получить определенный список элементов из MongoDB? - PullRequest
0 голосов
/ 23 октября 2018

Я хочу получить определенный список элементов из таблицы Mongodb.

Предположим, у меня есть две переменные в моем классе Employee -:

public Class Employee
{
private String Id;
private String Name;
.
.

теперь, когда я сделаю выборкузапрос будет что-то вроде -:

List<Employee> list=mongoTemplate.findAll();

, а затем я переберу каждый объект сотрудника, чтобы получить идентификатор сотрудника и сохранить в List<String>

Теперь я хочу решениетаким образом, чтобы я мог получить все идентификаторы за один раз. Что-то вроде -:

List<String> employeeId = someCodeHere; 

Пожалуйста, помогите, если можете

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

В соответствии с Справочной документацией Mongos по отдельной операции :

Находит отличительные значения для указанного поля в одной коллекции или представлении и возвращает результаты в массиве.

В Spring Data MongoDB это может быть достигнуто следующим образом:

DistinctIterable<String> distinctIds =
    mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
    .distinct("id", String.class);

return Lists.newArrayList(distinctIds);

// or

BasicDBObject dbObject = new BasicDBObject();
dbObject.append("name", new BasicDBObject("$regex", ".*and.*"));

DistinctIterable<String> distinctIds =
    mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
    .distinct("id", dbObject, String.class);

return Lists.newArrayList(distinctIds);

MongoTemplate предлагает здесь несколько перегрузок для разных.Запрос для начинающих будет собирать все идентификаторы для записей коллекции сотрудников, в то время как последний будет выполнять фильтрацию только для идентификаторов сотрудников, которые содержат and в своем имени.

Для преобразования итеративного результатаустановив на запрошенный список объектов String, вы можете использовать функцию newArray(...) в Guava .

Как @Veeram также упомянул в своем комментарии, вы, конечно, можете также использовать прогнозируемый запроснапример,

Query query = Query.query(Criteria.where(...));
query.fields().include("id");

return mongoTemplate.find(query, String.class);

, где query.fields().include("id") используется для указания полей, которые вас действительно интересуют.

В отличие от distinct, этот подход будет содержать повторяющиеся записи в списке результатов,если есть.Хотя идентификатор в общем случае должен быть уникальным, выполнение этих двух запросов к именам может привести к результату, который, однако, содержит несколько идентичных записей.

Хотя ответ, данный @Boris, также технически действителен, он может иметь некоторую производительностьвлияние, к сожалению, особенно если нужно получить много вложенных и ссылочных документов.Поэтому я бы не рекомендовал такой подход.

Последнее замечание: в примерах я держал поля Id и Name строчными буквами, так как это в основном Соглашение об именах Java .

0 голосов
/ 23 октября 2018

Вы можете использовать Java Stream API :

private List<String> getEmployeeIds() {
  return mongoTemplate.findAll().stream()
    .map(Employee::getId)
    .filter(Objects::nonNull)
    .collect(toList());
}

Сначала вы запрашиваете всех сотрудников, затем преобразуете в поток, отображаете Employee в Id и затем агрегируете все ненулевые значения для списка.

Если ваш Repository использует метод запроса Java Stream :

Stream<Employee> findAll();

, тогда вы не сможетене нужно вызывать stream() метод внутри getEmployeeIds().

РЕДАКТИРОВАТЬ: добавлена ​​фильтрация нулевого значения из потока

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...