Как обновить встроенные объекты в Spring Mongodb - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю над простой реализацией Spring MongoDB.

Мои объекты выглядят так:

@Document(collection = "Book")
public class Book {
    @Id
    private ObjectId id;  // Note: This should be BinInt, String or ObjectId
    private List<Author> author;
    @Indexed  // Note: On which fields we write where clause
    private String bookName;
    private int price;
    private int rating;
    private Date publishedDate;
    private Map<String, String> contentIndex = new HashMap<>();
    private List<String> tags;
    private Publisher publisher;

    @PersistenceConstructor
    public Book(ObjectId id, List<Author> author, String bookName, String firstName, String lastName, int price, int rating, Date publishedDate, Map<String, String> contentIndex, List<String> tags, Publisher publisher) {

}

@Data
public class Publisher {
    @Id
    private ObjectId id;
    private String firstName;
    private String lastName;
    private int bookCount;
    private Date dob;
    private String email;
    @PersistenceConstructor
    public Publisher(ObjectId id, String firstName, String lastName, int bookCount, Date dob, String email) {

}

@Data
public class Author {
    @Id
    private ObjectId id;
    private String firstName;
    private String lastName;
    private String email;
    private int bookCount;
    private Date dob;
    @PersistenceConstructor
    public Author(ObjectId id, String firstName, String lastName, int bookCount, Date dob) 
}

Я могу выполнять все основные операции CRUD над объектом BooK, просто расширяя MongoRepositoy. Теперь я пытаюсь выполнить те же операции CRUD для встроенных объектов Publisher и массива авторов в объекте BooK.

Я пытаюсь это сделать, но не нашел решения. Я просмотрел документацию Spring MongoDB о Query and Update и несколько вопросов о переполнении стека. Но пока я не могу этого сделать.

Я хочу сделать следующее:

  • как обновить значения полей в объекте book.publisher.
  • как обновить поля book.authors [1].
  • как добавить нового автора в объект списка book.authors.

1 Ответ

0 голосов
/ 07 мая 2020

как обновить значения полей в объекте book.publisher.

public void updatePublisher(BigInteger bookId, Publisher publisher) {
    Query query = new Query();
    query.addCriteria(Criteria.where("id").is(bookId));
    Book book;
    book = mongoTemplate.findOne
            (query, Book.class);
    Update update = new Update();
    if (publisher.getFirstName() != null)
        update.set("publisher.firstName", publisher.getFirstName());
    if (publisher.getLastName() != null)
        update.set("publisher.lastName", publisher.getLastName());
    if (publisher.getBookCount() != null)
        update.set("publisher.bookCount", publisher.getBookCount());
    if (publisher.getEmail() != null)
        update.set("publisher.email", publisher.getEmail());
    mongoTemplate.findAndModify(query, update, Book.class);
}

как обновить поля book.authors [1].

public void updateAuthor(BigInteger bookId, Author author) {
    Query query = new Query();
    query.addCriteria(Criteria.where("id").is(bookId));
    Book book;
    book = mongoTemplate.findOne(query, Book.class);
    Author old = null;
    if (book != null) {
        List<Author> al = book.getAuthors().getAuthors();
        int index = -1;
        for (int i = 0; i < al.size() && index == -1; i++) {
            if (author.getId().equals(al.get(i).getId()))
                index = i;
        }
        if (index > -1) {
            old = book.getAuthors().getAuthors().get(index);
            book.getAuthors().getAuthors().remove(index);
            book.getAuthors().getAuthors().add(author); // Note: If you need merge of new object to old then , copy field by field from new object to old object.
            mongoTemplate.save(book);
        }

    }
}

как добавить нового автора в объект списка book.authors.

  public Author addAuthor(BigInteger bookId, Author author) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(bookId));
        Book book;
        book = mongoTemplate.findOne
                (query, Book.class);

        if (book != null) {
            book.getAuthors().getAuthors().add(author);
            mongoTemplate.save(book);
        }
        return author;
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...