@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只读取了需要的数据。不知道有没有其他更好的办法。大家如果有的话。可以给我留言。

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐