2017-01-02 5 views
1

Я новичок в Morphia и пытается обновить существующий встроенный массивList объекта. Вот мой класс:Как обновить список встроенных объектов в морфию?

@Entity 
public class Student { 
    @Embedded private List<Address> address; 
    private String name; 
    private Long id; 
    ... getter and setter .. methods 
} 

@Embedded 
public class Address { 
    private Long customId; 
    private String name; 
    ... getter and setter .. methods 
} 

Json для указанного класса:

{ 
"student":{ 
    "address": [{ 
     "customId": "123456", 
     "name": "Jack" 
    }, { 
     "customId": "78901", 
     "name": "sam" 
    }], 
    "name": "Teacher", 
    "id" : 1234567890 
} 

я должен обновить address.name где address.customId является 78901. Я пытался следовать документации Morphia, но ничего не нашел.

Я думал удалить элементы сначала с 78901address.customId, затем добавить данные в существующий список. Для удаления данных я сделал это:

UpdateOperations<Student> ops; 
     Query<Student> updateQuery = datastore.createQuery(Student.class).filter("id", 1234567890); 
     ops = datastore.createUpdateOperations(Student.class).disableValidation().removeAll("address", new BasicDBObject("customId", 78901)); 

Приведенных выше кода успешно удалением ожидающих данных, но я не уверен, как добавить данные в существующий список. Любая помощь будет заметна. Спасибо

+0

Почему вы не манипулируете непосредственно списком java и не сохраняете свою сущность в базе данных? – c4k

ответ

0

Вы можете попробовать что-то вроде этого.

Определите местонахождение внедренного документа для обновления.

Query<Student> searchQuery = datastore.createQuery(Student.class).field("id").equal(1234567890).field("address.customId").equal(78901); 

Используйте оператор $ positional для ссылки на найденный внедренный документ и $ set, чтобы обновить значение.

UpdateOperations<Student> updateQuery = datastore.createUpdateOperations(Student.class).disableValidation().set("address.$.name", "othername"); 
datastore.update(searchQuery, updateQuery);