2012-02-08 78 views
3

对于Morphia使用Mongodb并看到许多高级答案如何实现这一点真的很新颖。在Morphia中如何更新ArrayList中的一个嵌入对象

我希望它简单,如果这是可以做到的,我有这个@Embedded对象调用
fileObjects包含Files对象。

我无法更新Files中的字段。

我想只更新一个字段f.ex String fileHash

@Entity 
public class BatchData { 

    @Id private ObjectId id; 
    @Embedded 
    public ArrayList<Files> fileObjects = new ArrayList<Files>(); 
} 

UPDATE .. 读数Morphia Updating维基不“真”说,如何做到这一点,只有当数组包含Integer这样的:

@Embedded 
    List<Integer> roomNumbers = new ArrayList<Integer>(); 

这是我尝试到目前为止:

mongo.createUpdateOperations(BatchData.class).add("fileObjects", Files, false); 

该代码插入的Files已经在mongo中。 false未检测到并将其插入到数组的末尾。我可以添加一个唯一的ID到Files,以便它检测到插入的Files存在于数组中,然后只更新它?

@Embedded 
public class Files 
{ 
    public Files() { 

    } 

    public int position; 
    public String fileName = ""; 
    public String fileHash = ""; 

    public Files(int pos, String fileName, String fileHash) { 
     this.position = pos; 
     this.fileName = fileName; 
     this.fileHash = fileHash; 
    } 
} 

阅读其他答案喜欢morphia-mongodb-accessing,但他已经有了
@Entity BlogEntry(见链接)蒙戈之外的POJO。也许我必须这样做?
拉出来,改变它并保存回去?

回答

6

回答我自己的问题,任何人的喜悦。

我想我解决了它不知道。
它看起来像是在测试什么时候fileObjects有很多Files
确实更新了右边的fileHash

UpdateOperations<BatchData>updateOperations=mongo.createUpdateOperations 
      (BatchData.class) 
      .disableValidation().set("fileObjects.$.fileHash",hash).enableVali..; 

mongo.update(mongo.createQuery(BatchData.class) 
      .filter("uuid",theBatch.uuid) 
      .filter("fileObjects.fileName","theFileName"),updateOperations); 
+0

它工作得很好。 Morphia应该在本地支持它。现在我们必须禁用使用这个“$”操作符的验证。 – 2012-11-16 02:17:56

1

在我来说,我能够使用RemoveAll方法:

UpdateOperations<MyType> ops = ds.createUpdateOperations(
      MyType.class).removeAll("myEmbeddedList", "thevalue"); 
ds.update(ds.find(MyType.class).get(), ops); 

这个假设的MyType具有字段列表myEmbeddedList;而且有一个“价值”从名单中删除。

0

我(是啊,现在)解决了这个问题,这种方式: 我得到的根类与查询

List<Applications> fileList = mDatastore.createQuery(File.class).field("_id").equal(new ObjectId(ID)).asList(); 

然后,我已经实现了这个根类里面的CRUD操作(我“会后我的根类):

@Entity 
public class Applications extends BaseEntity{ 


    private String name;  
    private String owner; 
    private String version; 

    @Embedded 
    List<Resources> resources = new ArrayList<>(); 

    @Embedded 
    List<Activities> activities = new ArrayList<>(); 

    @Embedded 
    List<Components> components = new ArrayList<>(); 

    public Applications() { 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getOwner() { 
     return owner; 
    } 

    public void setOwner(String owner) { 
     this.owner = owner; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public Applications setVersion(String version) { 
     this.version = version; 
     return this; 
    } 

    public List<Resources> getResources() { 
     return resources; 
    } 

    public Applications setResources(List<Resources> resources) { 
     this.resources = resources; 
     return this; 
    } 

    public Resources getResourcesByName(String name) { 
     for(Resources resource : this.resources){ 
      if (resource.getName().equals(name)) 
       return resource; 
     } 
     return null; 
    } 

    public boolean containsResourceByName(String name) { 
     for(Resources resource : this.resources){ 
      if (resource.getName().equals(name)) 
       return true; 
     } 
     return false; 
    } 



    public Applications addResource(Resources newResource) { 
     if (!containsResourceByName(newResource.getName())) { 
      this.resources.add(newResource); 
     } 
     return this; 
     } 

    public Applications removeResource(Resources newResource) { 
     if (containsResourceByName(newResource.getName())) { 
      this.resources.remove(getResourcesByName(newResource.getName())); 
     } 
     return this; 
    } 

    public Applications removeResourceByName(String name) { 
     if (containsResourceByName(name)) { 
      this.resources.remove(getResourcesByName(name)); 
     } 
     return this; 
    } 

    public List<Activities> getActivities() { 
     return activities; 
    } 

    public Applications setActivities(List<Activities> activities) { 
     this.activities = activities; 
     return this; 
    } 

    public Activities getActivityByName(String name) { 
     for(Activities activity : this.activities){ 
      if (activity.getName().equals(name)) 
       return activity; 
     } 
     return null; 
    } 

    public boolean containsActivityByName(String name) { 
     for(Activities activity : this.activities){ 
      if (activity.getName().equals(name)) 
       return true; 
     } 
     return false; 
    } 

    public Applications addActivity(Activities newActivity) { 
     if (!containsActivityByName(newActivity.getName())) { 
      this.activities.add(newActivity); 
     } 
     return this; 
     } 

    public Applications removeActivity(Activities newActivity) { 
     if (containsActivityByName(newActivity.getName())) { 
      this.activities.remove(getActivityByName(newActivity.getName())); 
     } 
     return this; 
    } 

    public Applications removeActivityByName(String name) { 
     if (containsActivityByName(name)) { 
      this.activities.remove(getActivityByName(name)); 
     } 
     return this; 
    } 

    public List<Components> getComponents() { 
     return components; 
    } 

    public Applications setComponents(List<Components> components) { 
     this.components = components; 
     return this; 
    } 

    public Components getComponentByName(String name) { 
     for(Components component : this.components){ 
      if (component.getName().equals(name)) 
       return component; 
     } 
     return null; 
    } 

    public boolean containsComponentByName(String name) { 
     for(Components component : this.components){ 
      if (component.getName().equals(name)) 
       return true; 
     } 
     return false; 
    } 

    public Applications addComponent(Components newComponent) { 
     if (!containsComponentByName(newComponent.getName())) { 
      this.components.add(newComponent); 
     } 
     return this; 
     } 

    public Applications removeComponent(Components newComponent) { 
     if (containsComponentByName(newComponent.getName())) { 
      this.components.remove(getComponentByName(newComponent.getName())); 
     } 
     return this; 
    } 

    public Applications removeComponentByName(String name) { 
     if (containsComponentByName(name)) { 
      this.components.remove(getComponentByName(name)); 
     } 
     return this; 
    } 

    public Applications updateComponentByName(String name, String newName) { 
     if (containsComponentByName(name)) { 
      getComponentByName(name).setName(newName); 
     } 
     return this; 
    } 


    @Override 
    public String toString() { 

     try { 
      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put(DatabaseModel.ApplicationsModel.FIELD_ID, id); 
      jsonObject.put(DatabaseModel.ApplicationsModel.FIELD_NAME, name); 
      jsonObject.put(DatabaseModel.ApplicationsModel.FIELD_OWNER, owner); 
      jsonObject.put(DatabaseModel.ApplicationsModel.FIELD_VERSION, version); 
      jsonObject.put(DatabaseModel.ActivitiesModel.DOCUMENT_NAME, activities); 
      jsonObject.put(DatabaseModel.ResourcesModel.DOCUMENT_NAME, resources); 
      jsonObject.put(DatabaseModel.ComponentsModel.DOCUMENT_NAME, components); 
      return jsonObject.toString(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return "Something went wrong"; 
     } 

    } 

有一次,我修改了应用程序的数据我只是将它保存在主程序与MongoDB的:

mDatastore.save(mApplications); 

希望这能帮助你,再见!

相关问题