如何使用Spring的MongoTemplate和Query类检索字段子集?

23

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

控制台命令

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

MongoTemplate

:MongoTemplate是Spring Data MongoDB的核心类之一,它简化了与MongoDB进行交互的过程。

mongoTemplate.find(new Query(...), Person.class)

你可以在MongoDB手册中找到有关投影(子集)查询的信息。


你正在告诉它查找 name:1。这肯定意味着你想要返回 1 - Ash Burlaczenko
1
在Query对象上似乎有一个fields()方法:http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/#mongodb-template-query.query - Kyle Banker
看起来你必须使用@Query注释才能利用这个功能。希望我对此是错误的。 - JARC
4个回答

61
Query q = new Query();
q.fields().include("name");
mongoTemplate.find(q, Person.class);

谢谢 - 这真是救命稻草。不过我希望Spring文档能更好一些 - 当我点击这里http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/query/Field.html时,所有方法的文档都是空白的。 - Simon
@JamesC 它能正常工作,但它返回了一个对象。如果我只想获取像String myField = mongoTemplate.find(query, "myCollection")这样的字段,是否有可能实现呢? - Half Blood Prince
1
@HalfBloodPrince 晚到派对了,但抱歉,事情不是那样运作的。 - Madbreaks

4
mongoTemplate.getCollection(COLLECTION).find(null, new BasicDBObject(FIELD, "1"))

如果我们需要投影多个字段,那么方法 find 的第二个参数会是什么样子? - asgs
2
@asgs 你可以使用Map构建BasicDBObject,或者解析JSON投影并将其转换为DBObject: DBObject projection = (DBObject) JSON.parse("{'_class':1, 'field1':1, 'field2':1}"); - Panayiotis Poularakis

2
如果目标是仅使用字段子集填充标准域对象,则使用如另一个答案中所述的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 查询

mongoTemplate.find(new Query(...), PersonNameOnly.class);

如果您想使用同一个投影对象用于多种类型,则可以从投影对象中省略带有集合名称的@Document声明,并在MongoTemplate查询中指定集合名称。 投影类
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");

1

您可以使用:

mongoTemplate.findDistinct(String field, Class<?> entityClass, Class<T> resultClass);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接