3

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

在 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", "??");
4

2 回答 2

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

或设置:

ops = datastore.createUpdateOperations(FriendList.class).set("friendList", listOfFriends);
datastore.update(updateQuery, ops);
于 2011-12-11T16:05:47.813 回答
-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,但这可能有点矫枉过正......

于 2011-12-11T13:00:05.877 回答