MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment traiter les demandes d'insertion dans Spring Data avant de les ajouter à MongoDB ?

Il semble que vous feriez mieux d'écrire un contrôleur personnalisé au lieu d'utiliser Spring Data REST ici car vous avez essentiellement besoin de deux ressources :une pour ajouter un lien ou renvoyer un lien existant et une seconde pour récupérer un URI d'origine via son hachage.

Dans la première méthode, vous appelez simplement une méthode de référentiel findByLongURL(…) et utilisez l'URL obtenu exemple si vous avez un résultat ou effectuez une deuxième étape pour réellement créer le hachage et enregistrer l'URL référentiel de pensée d'instance. La deuxième ressource vous appellerait simplement une méthode déjà existante.

C'est simple et facile à digérer.

Si vous avez besoin que l'implémentation de l'ancienne méthode soit une opération atomique, la méthode de requête du référentiel doit être implémentée manuellement (pour des instructions générales à ce sujet, lisez la section correspondante dans le documentation de référence ):

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);
  }
}

Comme vous pouvez le voir, cela implique de traiter certains détails de niveau inférieur (bien que la verbosité puisse être réduite en utilisant des importations statiques), mais cela vous donne essentiellement une opération atomique.