Как добавить вложенный документ в Spring 5 Reactive? - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу добавить вложенный документ в документ, используя Spring 5 Reactive.

Для этого я посмотрю свой класс Combat, затем использую массив строк, которые являются идентификаторами, найду эти конкретные существующие документы символов и скопирую их содержимое в документ боя.

URL будет выглядеть следующим образом:

@PatchMapping("/{combId}/characters/add")

У меня есть следующая модель класса боя:

@ToString
@Getter
@Setter
@AllArgsConstructor
@Data
@Document
public class Combat {

    @Id
    private String id;

    private String campaignId;
    private String name;
    private String description;
    @JsonFormat
            (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "GMT", locale = "en_US")
    private Date dateCreated;
    private Set<Character> playerCharacters = new HashSet<>(); // complete documents of the PCs
    private Set<Pet> pets = new HashSet<>(); // complete documents of the Pets
    private Set<String> monsters = new HashSet<>(); // ids of the monsters
}

Вместе с моделью персонажа:

@ToString
@Getter
@Setter
@AllArgsConstructor
@Data
@Document
public class Character {

    @Id
    private String id;

    private String campaignId;
    private String playerId;
    private String photoUrl;
    private Combatant combatant;


}

Боевой ресурс будет выглядеть следующим образом:

public Mono<Combat> saveCombat(@RequestBody String[] characters, @PathVariable("combId") final String combId) {
    Mono<Combat> combat = combatRepository
            .findById(combId);

    Set<String> characterStringSet = Arrays.stream(characters).collect(Collectors.toSet());

    Flux<Character> characterFlux = characterStringSet.stream()
            .map(characterRepository::findById);

Я довольно новичок в Reactive, и я просто совершенно не знаю, как это сделать.Как вы можете видеть, я начал распадаться на итеративный стиль программирования, потому что понятия не имел.Если у кого-то есть какие-либо предложения, это было бы замечательно.

1 Ответ

0 голосов
/ 14 ноября 2018

Я думаю, что следующее сделает то, что вы ищете. Он берет идентификаторы персонажей, получает различные значения, загружает каждое из них, собирает их в набор, затем объединяет их с желаемым боевым объектом, назначает персонажей, а затем сохраняет бой и возвращает его.

public Mono<Combat> saveCombat(@RequestBody String[] characterIds, @PathVariable("combId") final String combId) {
    return Flux.fromArray(characterIds)
        .distinct()
        .flatMap(characterRepository::findById)
        .collect(HashSet::new, Set::add)
        .zipWith(combatRepository.findById(combId), (characters, combat) -> {
            combat.setCharacters(characters);
            return combat);
         })
        .flatMap(combatRepository::save);
}
...