MongoTemplate upsert - la manière facile de faire une mise à Jour à partir des pojo (dont l'utilisateur a editted)?
Ici est un simple pojo:
public class Description {
private String code;
private String name;
private String norwegian;
private String english;
}
Et s'il vous plaît voir le code suivant pour appliquer une upsert
à MongoDb via printemps MongoTemplate:
Query query = new Query(Criteria.where("code").is(description.getCode()));
Update update = new Update().set("name", description.getName()).set("norwegian", description.getNorwegian()).set("english", description.getEnglish());
mongoTemplate.upsert(query, update, "descriptions");
La ligne pour générer le Update
objet spécifie tous les domaines de la Item
classe manuellement.
Mais si mon Item
objet de modifications, puis mon Dao couche de pauses.
Donc est-il un moyen pour éviter de le faire, de sorte que tous les champs de mon Item
classe sont appliqués automatiquement à la mise à jour?
E. g.
Update update = new Update().fromObject(item);
Remarque que mon pojo ne s'étend pas DBObject
.
OriginalL'auteur vikingsteve | 2013-11-15
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur le même problème. Dans le courant du Printemps de Données MongoDB version pas une telle chose est disponible. Vous devez mettre à jour le séparer les champs à la main.
Toutefois, il est possible avec un autre cadre: Morphia.
Ce cadre a un wrapper pour DAO fonctionnalités: https://github.com/mongodb/morphia/wiki/DAOSupport
Vous pouvez utiliser le DAO API pour faire des choses comme ça:
OriginalL'auteur wvandrunen1982
J'ai trouvé une très bonne solution pour cette question
Plz noter que la mise à Jour.fromDBObject retour d'une mise à jour de l'objet avec tous les champs dans dbDoc. Si vous voulez juste de mettre à jour les champs non null, vous devez le code d'une nouvelle méthode pour exclure les champs null.
Par exemple, à l'avant-poste d'un doc comme ci-dessous:
Nous avons seulement besoin de mettre à jour le champ "langue":
plz noter que la mise à Jour.fromDBObject remplacera tous les champs dans dbDoc. Si u veux juste créer de mise à Jour avec les champs non null, u coder vous-même.
OK pour la réponse, mais cela définit également des objets nuls. Si vous ne voulez pas des objets null être mis à jour, vous devez inclure une ObjectMapper avec l'option pour ignorer les comprend. C'est @gogstad commentaire sur Vivek Sethi réponse. Merci en passant.
OriginalL'auteur PaniniGelato
vous pouvez utiliser l'option enregistrer : (si non existe = insérer d'autre = upsert)
lire : javadoc
OriginalL'auteur Nimrod007
C'est ce que je fais pour le moment. Pas tellement élégante façon de le faire, mais il permet de gagner un précieux DB appel:
ObjectMapper
n'est pas sérialiser les valeurs null:String jsonStr = objectMapper.copy().setSerializationInclusion(JsonInclude.Include.NON_NULL).writeValueAsString(object);
OriginalL'auteur Vivek Sethi
Si vous voulez upsert Pojo incl. propriété
String id;
vous devez exclure le champ _id dans le fromDBObject méthodeUpdate.fromDBObject(dbDoc,"_id"
).Sinon vous aurez l'Exception:
parce que le champ _id de la première est nulle
Fullcode @PaniniGelato réponse serait
Puis le upsert est de travail dans le cas de l'insertion et mise à jour. Corrections & des réflexions sont les bienvenus 😉
@Version
- tagged champ dans votre entité, cette approche va interférer avec le printemps de la version d'incrémentation, de produire une exception non Valide "BFILS nom de champ $inc". Dans ce cas, on doit effectuer une itération sur les dbDoc et l'utilisationupdate.set
comme dans @PaniniGelatos réponse.OriginalL'auteur Chris
Il y a deux cas doivent être distingués:
Dans le Cas 1), Vous pouvez simplement utiliser mongoTemplate.enregistrer(pojo, "collection"), parce que votre POJO aura déjà rempli un ObjectID dans son champ id.
Dans le cas 2) Vous devez expliquer à mongo ce qui "existe déjà" signifie dans le cas de votre modèle de domaine: Par défaut, le mongoTemplate.méthode save() met à jour un élément existant, si il y en a un avec le même ObjectId. Mais avec un nouvellement instancié POJO vous n'avez pas que des id. Par conséquent, la mongoTemplate.upsert() la méthode a un paramètre de requête que vous pouvez créer comme ceci:
OriginalL'auteur Robert
Je pense que:
Description permet d'ajouter une propriété
puis obtenir un document par la condition de requête,de définir la Description de l'id du document d'identité.
et enregistrer
OriginalL'auteur stoneHah
Suffit d'utiliser
ReflectionDBObject
- si vous faitesDescription
l'étendre, vous devez juste obtenir votre objet de champs transféré àUpdate
reflectively, magiquement. La note ci-dessus sur les champs null inclus dans la mise à jour est toujours valable.OriginalL'auteur V. F.
c'est très simple moyen d'économiser de chaîne json dans la collection à l'aide de mongodb
et au printemps.
Cette méthode peut être remplacer à utiliser comme JSONObject.
OriginalL'auteur Awanish Kumar
La solution pour un nouveau printemps de données mongodb la version 2.X.X.
L'API a évolué, depuis le 2.X.X version:
au lieu de (1.X.X):
La solution complète:
Ça marche!!!
OriginalL'auteur Dawid
OriginalL'auteur 字云龙