Printemps MongoRepository est mise à jour ou upserting au lieu de les insérer
Je suis en utilisant une :
org.springframework.data.mongodb.repository.MongoRepository
Je commence avec un vide DB et de créer un objet avec _id = 1234
par exemple, et de régler certaines autres champ de type Chaîne de hello
par exemple, puis faire:
repository.save(object);
Tout va bien, il enregistre le document dans MondoDB.
- Je créer un NOUVEL objet, définissez la même _id = 1234
mais l'autre champ de type Chaîne de world
, puis à un autre enregistrer :
repository.save(newObject);
Résultats : l'enregistrement des œuvres, mais des mises à jour de l'objet d'origine.
Résultats attendus: Ce doit échouer avec une DuplicateKeyException
comme _id
est unique et je suis à l'aide de 2 objets distincts lorsque vous faites chaque enregistrement.
Défaut au printemps ou suis-je en train de faire quelque chose de mal ???
OriginalL'auteur Marc | 2015-03-13
Vous devez vous connecter pour publier un commentaire.
Enregistrer, par définition, est censé mettre à jour un objet dans le upsert style, mise à jour si le présent et l'insérer dans le cas contraire.
Lire la
save
documentation d'exploitation sur la MongoDb site webLa insérer opération dans mongodb a le comportement que vous attendez, mais à partir de la MongoRepository la documentation, il semble que l'insertion est déléguée à enregistrer afin de ne pas faire de différence. Mais vous pouvez lui donner un essai et voir si cela fonctionne pour vous. Sinon, vous pouvez simplement faire un get avant de vérifier si l'objet existe, puisque c'est une recherche d'index, il sera rapide.
_id
semble se comporter différentes que dans tout autre domaine. Par exemple, si j'ai un champ appeléname
dans les mongo du document, et de créer un index UNIQUE sur ce domaine, en faisant les étapes de ma question va entraîner un attenduDuplicateKeyException
être jeté. En outre, pour le printemps mongorepository de l'API, il n'y a pas deinsert
APIsave
. J'ai le sentiment que c'est un bug au printemps.Il existe une méthode d'insertion: docs.printemps.io/printemps-données/mongodb/docs/actuel/api/org/...
La validation de l'indice est différent, l'optimisation de l'enregistrer, c'est qu'il peut directement mettre à jour l'objet s'il est trouvé, c'est par la conception.
Ah, je suis en utilisant une ancienne version qui n'a pas la
insert
API. Merci pour cette remarque, je vais mettre à niveau le Printemps et l'essaiinsert
et de faire rapport à mes résultats plus tard. Merci beaucoup.Upvote/accepter si la réponse m'a aidé 🙂
OriginalL'auteur tinker
l'application est mise à jour uniquement lorsque vous avez l'annotation @Id pour un de la le domaine, après beaucoup de difficulté a trouvé ce
mais de toute façon je ne pouvais pas utiliser
@Indexé(unique=true, direction=IndexDirection.En DESCENDANT, dropDups=true)
OriginalL'auteur Naveen