Как обновить одно поле в MongoDB?

#angular #mongodb #spring-boot

#angular #mongodb #весенняя загрузка

Вопрос:

Я использую Angular Spring Boot MongoDB для своего проекта. Я пытаюсь обновить только одно поле. Когда я пытаюсь сделать это в Postman, все остальные поля становятся null . Как я могу обновить только одно поле?

Я использую Postman для тестирования и хотел бы использовать эту функцию в Angular в будущем.

Хранилище данных

 package com.indsys.TravBackEnd.repositories;

import com.indsys.TravBackEnd.models.DateStorage;

import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
@ComponentScan({"com.indsys.TravBackEnd"})
@EntityScan("com.indsys.TravBackEnd")
public interface DateStorageRepository extends MongoRepository<DateStorage, String> {
}
 

DateStorageController

 package com.indsys.TravBackEnd.controllers;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.indsys.TravBackEnd.exceptions.ResourceNotFoundException;
import com.indsys.TravBackEnd.models.DateStorage;
import com.indsys.TravBackEnd.repositories.DateStorageRepository;

@CrossOrigin("*")
@RestController
@RequestMapping("/api")
public class DateStorageController {
    @Autowired
    private DateStorageRepository dateStorageRepository;

    @GetMapping("/datestorage")
    public List<DateStorage> getAllDateStorages() {
        return dateStorageRepository.findAll();
    }

    @GetMapping("/datestorage/{id}")
    public ResponseEntity<DateStorage> getDateStorageById(@PathVariable(value = "id") String dateStorageId)
            throws ResourceNotFoundException {
        DateStorage dateStorage = dateStorageRepository.findById(dateStorageId)
                .orElseThrow(() -> new ResourceNotFoundException("DateStorage not found for this id :: "   dateStorageId));
        return ResponseEntity.ok().body(dateStorage);
    }

    @PostMapping("/datestorage")
    public DateStorage createDateStorage(@Validated @RequestBody DateStorage dateStorage) {
        return dateStorageRepository.save(dateStorage);
    }

    @PutMapping("/datestorage/{id}")
    public ResponseEntity<DateStorage> updateDateStorage(@PathVariable(value = "id") String dateStorageId,
            @Validated @RequestBody DateStorage dateStorageDetails) throws ResourceNotFoundException {
                DateStorage dateStorage = dateStorageRepository.findById(dateStorageId)
                .orElseThrow(() -> new ResourceNotFoundException("DateStorage not found for this id :: "   dateStorageId));
        dateStorage.setMtransactionID(dateStorageDetails.getMtransactionID());
        dateStorage.setStartDate(dateStorageDetails.getStartDate());
        dateStorage.setEndDate(dateStorageDetails.getEndDate());
        final DateStorage updatedDateStorage = dateStorageRepository.save(dateStorage);
        return ResponseEntity.ok(updatedDateStorage);
    }
    

    @DeleteMapping("/datestorage/{id}")
    public Map<String, Boolean> deleteDateStorage(@PathVariable(value = "id") String dateStorageId)
            throws ResourceNotFoundException {
                DateStorage dateStorage = dateStorageRepository.findById(dateStorageId)
                .orElseThrow(() -> new ResourceNotFoundException("Colours not found for this id :: "   dateStorageId));

        dateStorageRepository.delete(dateStorage);
        Map<String, Boolean> response = new HashMap<>();
        response.put("deleted", Boolean.TRUE);
        return response;
    }


}
 
 

Ответ №1:

Если вы имели в виду, что хотите обновить только одно поле с помощью маршрута updateDateStorage (например, только MtransactionId), то я бы рекомендовал вам проверить все поля на наличие нулевых значений, подобных этому:

 Optional.ofNullable(dateStorageDetails.getMtransactionID())
            .ifPresent(x -> dateStorage.setMtransactionID(x));

 

Сделайте это для каждого из полей, и тогда будут обновлены только те поля, которые вы ввели в postman…