В MongoDb Morphia как удалить или заменить объект массива - PullRequest
3 голосов
/ 11 декабря 2011

Я могу найти только как удалить первый, последний или выделенный объект
но мне нужно удалить весь массив.

В Morphia у меня это ниже Document FriendList.

В Document вы видите array friendList.
Мне нужно обновить array новым "friends".

Что должно произойти, я должен удалить все записи в friendList
прежде чем заселить его новыми друзьями.

Думал, что могу удалить его, а затем просто вставить новый
array friendList, содержащий "friends".

Как я могу удалить array?

Может быть, я не прав насчет того, как это сделать, поскольку я не могу найти решение ..

@Entity
public class FriendList {

    @Id private ObjectId id;

    public Date lastAccessedDate;

    @Indexed(name="uuid", unique=true,dropDups=true)  
    private String uuid;


    List<String> friendList;

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public List<String> getFriendList() {
        return friendList;
    }

    public void insertFriend(String friend) {
        this.friendList.add(friend);
    }

}

из документации Я пробую это в различных комбинациях без удачи:

mongo.createUpdateOperations(FriendList.class).removeAll("friendList", "??");

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Вы можете использовать метод unset, а затем добавить addAll или просто использовать set:

http://code.google.com/p/morphia/wiki/Updating#set/unset

Должно выглядеть примерно так:

ops = datastore.createUpdateOperations(FriendList.class).unset("friendList");
datastore.update(updateQuery, ops);
ops = datastore.createUpdateOperations(FriendList.class).addAll("friendList", listOfFriends);
datastore.update(updateQuery, ops);

или снабор:

ops = datastore.createUpdateOperations(FriendList.class).set("friendList", listOfFriends);
datastore.update(updateQuery, ops);
0 голосов
/ 11 декабря 2011

Как правило, вам нужно всего лишь использовать общие (Java) операции со списками - поэтому, чтобы очистить его, установите в списке значение null, удалите или добавьте записи по мере необходимости, ... так что вы можете просто загружать, манипулировать изатем сохраните сущность очень легко.

Почему у вас даже есть mongo.createUpdateOperations(FriendList.class)?Если объект довольно большой, вы можете не загружать и сохранять все данные для обновления одного поля.Однако я бы начал с простого подхода и использовал бы только более сложные запросы, если это необходимо.

Не оптимизируйте преждевременно - создавайте, тестируйте и оптимизируйте по мере необходимости!

РЕДАКТИРОВАТЬ:

В вашей сущности:

public function clearFriends(){
    this.friendList = null;
}

Везде, где вам это нужно:

FriendList friendList = ...
friendList.clearFriends();
persistence.persist(friendList); // Assuming you have some kind of persistence service with a persist() method

Или вы можете использовать некоторые специальные методы Morphia, например unset, но это может быть излишним..

...