MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come elaborare le richieste di inserimento in Spring Data prima di aggiungerle a MongoDB?

Sembra che tu stia meglio scrivendo un controller personalizzato invece di utilizzare Spring Data REST qui poiché hai sostanzialmente bisogno di due risorse:una per aggiungere un collegamento o restituire un esistente e una seconda per recuperare un URI originale tramite il suo hash.

Nel primo metodo dovresti semplicemente chiamare un metodo di repository findByLongURL(…) e usa l'URL ottenuto esempio se hai un risultato o esegui un secondo passaggio per creare effettivamente l'hash e salvare l'URL repository di pensiero di istanza. La seconda risorsa ti chiamerebbe fondamentalmente un metodo già esistente.

È semplice e facile da digerire.

Se è necessario che l'implementazione del primo metodo sia un'operazione atomica, il metodo di query del repository deve essere implementato manualmente (per istruzioni generali su questo leggere la sezione pertinente in documentazione di riferimento ):

class UrlRepositoryImpl implements UrlRepositoryCustom {

  private final MongoOperations operations;

  public UrlRepositoryImpl(MongoOperations operations) {
    this.operations = operations;
  }

  @Override
  public URL findOrInsert(String source) {

    // What to find?
    Query query = Query.query(Criteria.where("longURL").is(source);

    // What to write if nothing can be found
    Update update = new Update()
      .setOnInsert("longURL", source)
      .setOnInsert("hash", calculatedHash);

    FindAndModifyOptions options = new FindAndModifyOptions.options()
      .returnNew(true) // returns the document insert (if so)
      .upsert(true); // insert document if it doesn't exist

    return operations.findAndModify(query, update, options, URL.class);
  }
}

Come puoi vedere, ciò comporta la gestione di alcuni dettagli di livello inferiore (sebbene la verbosità può essere ridotta utilizzando importazioni statiche), ma sostanzialmente ti dà un'operazione atomica.