0
  1. I'm new to MongoDB and WebFlux. I'm trying to retrieve a 'Post' with its 'Comments'(List listComments) using 'CommentsIds'(List idComments) from this 'Post' POJO:

  2. That's my POJO/Entity:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "post")
public class Post implements Serializable {

    private static final long serialVersionUID = -6281811500337260230L;

    @EqualsAndHashCode.Include
    @Id
    private String id;
    private Date date;
    private String title;
    private String body;
    private AuthorDto author;
    private Comment comment;
    private List<Comment> listComments = new ArrayList<>();
    private List<String> idComments = new ArrayList<>();
}
  1. It is my Service (findPostByIdShowComments + findCommentsByPostId):
    public Mono<Post> findPostByIdShowComments(String id) {
        return postRepo
                .findById(id)
                .switchIfEmpty(postNotFoundException())
                .flatMap(postFound -> {

                    Flux<Comment> commentFlux = commentService
                            .findCommentsByPostId(postFound.getId());

                    Flux<Post> postFlux = commentFlux
                            .flatMap(comment -> {
                                postFound.setListComments(new ArrayList<>());
                                postFound.getListComments()
                                         .add(comment);
                                return Mono.just(postFound);
                            });

                    return Mono.just(postFound);
                });
    }


    public Flux<Comment> findCommentsByPostId(String id) {
        return postRepo
                .findById(id)
                .switchIfEmpty(postNotFoundException())
                .thenMany(commentRepo.findAll())
                .filter(comment1 -> comment1.getIdPost()
                                            .equals(id));

    }
  1. That's my controller:
    @GetMapping(FIND_POST_BY_ID_SHOW_COMMENTS)
    @ResponseStatus(OK)
    public Mono<Post> findPostByIdShowComments(@PathVariable String id) {
        return postService.findPostByIdShowComments(id);
    }
  1. As a result, I am not able to FEtch my 'Comments' and load them in the POJO, and consequently, I could not show them in the Rest Response Json. As a 'Json result' I am getting:
{
    "id": "5ff0ed93b3268a39dd3bd7b9",
    "date": "2011-11-11T00:00:00.000+00:00",
    "title": "Lake Cliffordside",
    "body": "North Sanfordborough",
    "author": {
        "id": "5ff0ed93b3268a39dd3bd7b6",
        "name": "melissa"
    },
    "comment": null,
    "listComments": [], //TROUBLE: As you can see, The CommentObjects are not coming
    "idComments": [
        "5ff0edb2b3268a39dd3bd7bc",
        "5ff0edbab3268a39dd3bd7bd"
    ]
}

Thanks a lot for your Guys help.

GtdDev
  • 748
  • 6
  • 14

1 Answers1

2

The reason why you don't receive comments is that your commentFlux and postFlux variables are just declared but never used in the execution chain.

public Mono<Post> findPostByIdShowComments(String id) {
    return postRepo
            .findById(id)
            .switchIfEmpty(postNotFoundException())
            .flatMap(postFound -> commentService
                    .findCommentsByPostId(postFound.getId())
                    .collectList()
                    // it might be also a good option (and a cleaner operator here) instead of .flatMap(...)
                    //.doOnSuccess(comments -> postFound.setListComments(comments))
                    //.thenReturn(postFound)
                    .flatMap(comments -> {
                        postFound.setListComments(comments);
                        return Mono.just(postFound);
                    })
            );
}

Now we injected comments flow and their injection into found post as a part of the main flow.

Stepan Tsybulski
  • 1,121
  • 8
  • 18
  • 1
    Thanks a lot @Stepan Tsybulski. Wonderful Solution, it is is perfect. I only add: instead 'return postFound;' use 'return Mono.just(postFound);' – GtdDev Jan 02 '21 at 23:35
  • ah, thanks, good catch, I edited the answer. Also you can try `.doOnSuccess(...)` operator and remove `flatMap` completely. I put it into the answer as well in the comments. Have a look – Stepan Tsybulski Jan 03 '21 at 09:23