Rohit
Rohit

Reputation: 2152

Spring Mongodb findandModify fails to update entire document

I am new to mongodb and struggling to understand how document update works. I have a document called 'menu':

{
 "someId":"id123",
 "someProperty":"property123",
 "list" : [{
    "innerProperty":"property423"
 }]
}

which maps to my entity:

@Document(collection = "menu")
public class Menu {
 @Id
 private String id;
 private String someid;
 private String someProperty;
 private List<SomeClass> list;

 // accessors
}

when I try to find and update this document like this it does not update the document. It sure does find the menu as as it returns the original entity with Id:

@Override
public Menu update(Menu menu) {
    Query query = new Query(
            Criteria.where("someId").is(menu.getSomeId()));
    Update update = Update.update("menu", menu);
    return mongoOperations.findAndModify(query, update,
            FindAndModifyOptions.options().returnNew(true), Menu.class);
}

But if I change it to this, it works:

@Override
public Menu update(Menu menu) {
    Query query = new Query(
            Criteria.where("someId").is(menu.getSomeId()));
    Update update = new Update().set("someProperty", menu.getSomeProperty())
     .set("list", menu.getList());
    return mongoOperations.findAndModify(query, update,
            FindAndModifyOptions.options().returnNew(true), Menu.class);
}

I don't really like this second method where each element of the document is individually set, as you might imagine I have a rather large document and is prone to errors.

Why does the first method not work? And what could be a better approach to update the document?

Upvotes: 1

Views: 8732

Answers (1)

Nic Cottrell
Nic Cottrell

Reputation: 9695

Check out the docs for findAndModify - it returns the version of the document before the fields were modified. If you do a new find() straight after, you will see that your changes were actually saved to MongoDB.

Upvotes: 2

Related Questions