В соответствии с Справочной документацией 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 .