Can’t modify @Embedded List in Morphia

Tags: , ,



I have the following Entity:

@Entity("users")
public class UserModel {
   @Id
   private ObjectId id;
   private String userID;
   private String prefix;
   private List<TodoList> todoLists;
   private List<Reminder> reminders;

The TodoList Object looks like this:

@Embedded
public class TodoList {
    private String name;
    private List<String> todos;
    private List<String> completed;

What I’m trying to do is to move a String from the todos ArrayList to the completed ArrayList inside a TodoList, here is how I’m trying to do that:

public void completeTodo(int listIndex, int todoIndex, UserModel userData) {
    String todo = userData.getTodoLists().get(listIndex).getTodos().remove(todoIndex);

    datastore.find(UserModel.class)
        .filter(Filters.eq("userID", userData.getId()))
        .update(UpdateOperators.set("todoLists." + listIndex + ".todos", userData.getTodoLists().get(listIndex).getTodos()), UpdateOperators.push("todoLists." + listIndex + ".completed", todo))
        .execute();
}

This doesn’t do anything and I have no clue of what could be wrong. Also, if I simply modify the full TodoList, moving the todo from the todos ArrayList to the completed ArrayList, and then using the set UpdateOperator like so:

public void completeTodo(int listIndex, int todoIndex, UserModel userData) {
    userData.getTodoLists().get(listIndex).completeTodo(todoIndex);

    datastore.find(UserModel.class)
        .filter(Filters.eq("userID", userData.getId()))
        .update(UpdateOperators.set("todoLists." + listIndex, userData.getTodoLists().get(listIndex)))
        .execute();
}

It still doesn’t work, even thought I logged the todo variable and the userData and it all looks correct, I just can’t manage to save it into the DB.

I also tried this:

public void completeTodo(int listIndex, int todoIndex, UserModel userData) {
    String todo = userData.getTodoLists().get(listIndex).removeTodo(todoIndex);
    System.out.println(todo); // This logs correctly, so at least the push operator should work

    datastore.find(UserModel.class)
        .filter(Filters.eq("userID", userData.getId()))
        .update(UpdateOperators.set("todoLists." + listIndex + ".todos", userData.getTodoLists().get(listIndex).getTodos()), UpdateOperators.push("todoLists." + listIndex + ".completed", todo))
        .execute();
}

where removeTodo is (inside the TodoList Embedded class):

public String removeTodo(int todoIndex) {
    return todos.remove(todoIndex);
}

Answer

Well I should have checked my code twice. It appears that userData.getId() wasn’t the right ID of the user in the database :/



Source: stackoverflow