MongoTemplate mongoDB返回指定字段
@Testpublic void test() {Query query = Query.query(Criteria.where("userId").is(1L));List<Publish> publishes = mongoTemplate.find(query, Publish.class);List<Long> collect = publishes.stream
·
@Test public void test() { Query query = Query.query(Criteria.where("userId").is(1L)); List<Publish> publishes = mongoTemplate.find(query, Publish.class); List<Long> collect = publishes.stream().map(Publish::getPid).collect(Collectors.toList()); collect.forEach(System.out::println); }
因为只想要一个集合里的一个字段,比如pid 。 之前的做法是,默认查询出所有的。然后
通过strem 流。过滤出所有的id。到一个新的集合。这种做法,如果实体类字段不多的话可以,但是实体类字段过多的话,肯定还是从mongodb中只查询返回需要的字段会好一点。
@Test
public void test1() {
Query query = Query.query(Criteria.where("userId").is(1L));
query.fields().include("pid").exclude("_id");
/*Expected to read Document Document{{pid=2031}} into type class java.lang.Integer but didn't find a PersistentEntity for the latter!
* {_id=5fae53927e52992e78a3aecd, pid=2031}
*{_id=5fae53927e52992e78a3aed9, pid=2032}
*{_id=5fae53927e52992e78a3aee5, pid=2033}
* {pid=2033}
* {pid=2034}
* {pid=2035}
*/
List<Object> result = mongoTemplate.find(query, Object.class, "quanzi_publish");
result.forEach(System.out::println);
}
通过query点fields 可以通过 include 指定需要返回的字段。可以链式编程。
exclude排除需要的字段。 因为如果指定需要的字段。不排除_id 的话查询的数据会默认包含_id
{_id=5fae53927e52992e78a3aecd, pid=2031} 所以我这里做了排除。
最后查询的结果是 {pid=2033} 此时我的pid 是一个Long 类型的数据。但是不能用
Long.class 去解析。只能用Object.clss 因为 {pid=2033} 虽然只有一个字段。但是从mongodb查询出来的应该是一个json对象。对象的属性只有一个。没有去看mongodb底层。但应该是做了json的解析。
@Test
public void test2() {
Query query = Query.query(Criteria.where("userId").is(1L));
List<MyLong> result = mongoTemplate.find(query, MyLong.class, "quanzi_publish");
List<Long> pids = result.stream().map(MyLong::getPid).collect(Collectors.toList());
pids.forEach(System.out::println);
}
class MyLong {
private Long pid;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
@Override
public String toString() {
return "MyLong{" +
"pid=" + pid +
'}';
}
}
既然是解析json 。我自己定义了一个类。同样的属性去接。然后用stream 流转为了long类型的list集合。这样做感觉也挺麻烦。但是如果集合字段特别多的话。这样应该能提升一些性能。毕竟如果直接读取整个集合,也是需要遍历。然后提取出id 到一个新集合。步骤差不多。这样只是从mongodb只读取了需要的数据。不知道有没有其他更好的办法。大家如果有的话。可以给我留言。
更多推荐
已为社区贡献2条内容
所有评论(0)