账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java MongoTemplate查询返回指定字段及指定数量的数据
    51
    0

    假设我有一个实体类Article

    @Data
    @Document(collection = "articles")
    public final class Article {
        @Id
        private String id;
        private String name;
        private String url;
        private String author;
        private List<Comment> comments;
    }

    实体类Comment

    @Data
    public final class Comment {
        private String userId;
        private String content;
    }

    已经通过测试用例添加进去几条数据,假设其中一个Article的_id为5b5694f38ec9b636c4e52d69
    可以通过MongoRepository获取到这个id的Article,也可以通过MongoTemplate获取,

    final String id = "5b5694f38ec9b636c4e52d69";
    Query query = new Query()
                  .addCriteria(Criteria.where("id").is(id));
    Article article = mongoTemplate.findOne(query, Article.class);

    这样可以获取到,现在我想只获取这个Article的List<Comment>,

    Document queryObject = new Document();
    queryObject.put("id", id);
    
    Document fieldsObject = new Document();
    fieldsObject.put("id", false);
    fieldsObject.put("comments", true);
    
    Query query = new BasicQuery(queryObject, fieldsObject);

    如果我find时返回List

    List comments = mongoTemplate.findOne(query, List.class);

    这样毫无疑问会出现异常,返回Article

    Article article = mongoTemplate.findOne(query, Article.class);
    List<Comment> comments = Optional.of(article).orElseThrow(ArticleNotFoundException::new)
                                                .getComments();

    这样可以获取List<Comment>,但是这样的获取意义不是很大,也无法获取指定数量的Commit(subList()也没有什么意义)。
    有没有什么方式直接返回List<Commit>呢,这样便可以使用limit()skip()
    如果没有,那有没有一种方式可以实现limit() skip()同样的效果?

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 凉辰梦瑾空人心。 普通会员 1楼

      在Java中,MongoTemplate是一个抽象类,它提供了与MongoDB服务器进行交互的接口。你可以通过MongoTemplate的方法来执行SQL查询,获取数据。

      以下是一个使用MongoTemplate查询指定字段和数量的数据的示例:

      ```java MongoTemplate mongoTemplate = MongoTemplate.getTemplate("mongodb://localhost:27017/mydatabase");

      // 查询指定字段的数据 List documents = mongoTemplate.find( Filters.eq("myField", "value"), Sorts.by("myField", pymongo排序ByField pymongo.sortOrder ASC) );

      // 打印查询结果 documents.forEach(document -> System.out.println(document.toJson())); ```

      在这个示例中,我们首先获取了与指定数据库和集合名称的MongoTemplate对象。然后,我们使用find方法执行一个查询,该查询将返回所有在myField字段中等于"value"的文档,并按照myField字段进行升序排序。

      最后,我们使用forEach方法遍历查询结果,并使用toJson方法将每个文档转换为JSON格式。

      请注意,你需要将"mongodb://localhost:27017/mydatabase"替换为你的MongoDB服务器的实际地址,将"myField"和"value"替换为你想要查询的字段名和你想获取的文档数量。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部