在MongoDb Morphia中如何删除或替换数组对象

时间:2011-12-11 09:11:29

标签: java mongodb morphia

我只能找到如何删除第一个,最后一个或选定的对象
但我需要删除整个数组。

在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);
    }

}
来自documentation

我尝试了各种组合而没有运气:

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

2 个答案:

答案 0 :(得分:2)

您可以使用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);

或使用set:

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

答案 1 :(得分:-2)

通常,您只需要使用常规(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,但这可能是一种矫枉过正......