In my database I have a document that looks like this
{
"_id" : ObjectId("5864ddd8e38112fd70b89893"),
"_class" : "com.apic.models.UserReg",
"name" : "Bijay",
"email" : "[email protected]",
"psd" : "16d932a5a3da90cc6afd831016b5a6821f0badf7e2c624159205924433613c3a",
"activationToken" : "fe8376ea2dbdf61ebc0f11a2361d741ba3178362d5bf876cf47e6a126bc5b39c",
"verified" : false
}
I also have a bean that looks like this
public class User {
@Id
private int id;
private String name;
private String email;
// getter/setter methods
}
So when I try to call save()
method of MongoOperations
, it replaces all missing properties like psd, verified and activationToken.
mongoOperations.save(user, COLLECTION);
Is there any way where I can update only the existing properties in my models class and leave others as it is?
If you want to set an arbitrary number of fields (but not overwrite others), you can add a function to your model that turns it into a Map
. If you're in Spring
obviously Jackson
is a good choice for this.
From there you can remove all null
values and then add each field that does have a value to a $set
operation.
Map<String, Object> objectMap = user.toMap();
objectMap.values().removeIf(Objects::isNull);
Update update = new Update();
objectMap.forEach(update::set);
return mongoOperations.findAndModify(
Query.query(Criteria.where("_id").is(user.getId())), update, User.class);
Yes you can call selective updates
Query query = new Query(new Criteria("id").is(user.getId()));
Update update = new Update().set("name", user.getName()).set("email", user.getEmail());
mongoOperations.updateFirst(query, update, COLLECTION);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With