Java 如何使用Spring';s MongoTemplate和查询类?

Java 如何使用Spring';s MongoTemplate和查询类?,java,spring,mongodb,mongodb-query,spring-data-mongodb,Java,Spring,Mongodb,Mongodb Query,Spring Data Mongodb,我希望能够执行以下控制台命令,以返回仅填充了字段子集但使用Spring类的所有行: 控制台命令 db.person.find(null,{name:1}) MongoTemplate mongoTemplate.find(新查询(…),Person.class) 可以找到有关投影(子集)查询的信息。您可以使用: mongoTemplate.findDistinct(String field, Class<?> entityClass, Class<T> resultC

我希望能够执行以下控制台命令,以返回仅填充了字段子集但使用Spring类的所有行:

控制台命令

db.person.find(null,{name:1})
MongoTemplate

mongoTemplate.find(新查询(…),Person.class)
可以找到有关投影(子集)查询的信息。

您可以使用:

mongoTemplate.findDistinct(String field, Class<?> entityClass, Class<T> resultClass);
mongoTemplate.findDistinct(字符串字段、类entityClass、类resultClass);

如果目标是仅使用字段子集填充标准域对象,请使用
d.fields().include()
,如中所述。然而,我经常发现拥有完整的对象是不可取的(部分填充的对象很容易误导未来的开发人员阅读代码),我更希望拥有一个只包含我正在检索的字段子集的对象。在这种情况下,仅使用字段子集创建和检索投影对象效果良好

投影类

@Document(“person”)//必须与person使用的集合名称相同
仅限公共类PersonName{
私有字符串名称;
公共字符串getName(){return name;}
public void setName(字符串名){this.name=name;}
}
MongoTemplate
query

mongoTemplate.find(新查询(…),PersonNameOnly.class);

如果要对多个类型使用同一投影对象,可以从投影对象中省略带有集合名称的
@Document
声明,并在
MongoTemplate
查询中指定集合名称

投影类

仅限公共类名称{
私有字符串名称;
公共字符串getName(){return name;}
public void setName(字符串名){this.name=name;}
}
MongoTemplate
query

mongoTemplate.find(新查询(…),NameOnly.class,“person”);

您告诉它查找
名称:1
。当然,这意味着您希望返回
1
。查询对象上似乎有一个fields()方法:看起来您必须使用@Query annotation才能利用此功能。希望我错了。谢谢-这是一个救命恩人。我希望spring文档会更好——当我点击这里时,所有的方法文档都是空的。@JamesC它可以工作,但它返回对象。如果我只想得到一个类似字符串myField=mongoTemplate.find(查询“myCollection”)的字段,该怎么办。有可能吗?@HalfBloodPrince参加聚会迟到了,但很抱歉,事情不是这样的。如果我们必须投影多个字段,那么方法
find
的第二个参数会是什么样子?@asgs您可以使用映射构造BasicDBObject,或者您可以解析json投影并将其转换为DBObject:
DBObject projection=(DBObject)JSON.parse(“{”类:1,'field1':1,'field2':1}”);
mongoTemplate.getCollection(COLLECTION).find(null, new BasicDBObject(FIELD, "1"))
mongoTemplate.findDistinct(String field, Class<?> entityClass, Class<T> resultClass);