Как получить подмножество полей, используя классы Springs MongoTemplate и Criteria
Я хочу иметь возможность выполнить следующую консольную команду, чтобы вернуть все строки только с заполненным подмножеством полей, но с использованием Spring MongoTemplate
учебный класс:
Консольная команда
db.person.find(null,{name:1})
MongoTemplate
mongoTemplate.find(new Query(...), Person.class)
Информацию о подмножестве запросов можно найти здесь, если вы заинтересованы http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields
Есть идеи?
ура
4 ответа
Query q = new Query();
q.fields().include("name");
mongoTemplate.find(q, Person.class);
mongoTemplate.getCollection(COLLECTION).find(null, new BasicDBObject(FIELD, "1"))
Если цель состоит в том, чтобы заполнить стандартный объект домена только подмножеством полей, используя
d.fields().include()
как описано в другом ответе, это путь. Однако часто я считаю, что наличие полного объекта нежелательно (наличие частично заполненного может легко ввести в заблуждение будущих разработчиков, читающих код), и я бы предпочел иметь объект только с подмножеством полей, которые я получаю. В этом случае хорошо работает создание и получение объекта проекции только с подмножеством полей.
Класс проекции
@Document("person") // Must be the same collection name used by Person
public class PersonNameOnly {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
запрос
mongoTemplate.find(new Query(...), PersonNameOnly.class);
Если вы хотите использовать один и тот же объект проекции для нескольких типов, вы можете опустить
@Document
объявление с именем коллекции из объекта проекции и укажите имя коллекции в запросе.
Класс проекции
public class NameOnly {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
MongoTemplate
запрос
mongoTemplate.find(new Query(...), NameOnly.class, "person");
Ты можешь использовать:
mongoTemplate.findDistinct(String field, Class<?> entityClass, Class<T> resultClass);