2012-02-08 7 views
3

MorphiaでMongodbを使うのは本当に新しいです。MorphiaでArrayList内の埋め込みオブジェクトを更新するにはどうすればいいですか

私はそれが可能だと私はFilesオブジェクトが含まれてい
fileObjectsと呼ばれるこの@Embeddedオブジェクトを持っている場合、それをシンプルにしたいと思います。

I Files内のフィールドを更新できません。

String fileHashのフィールドf.exを1つだけ更新したいとします。

@Entity 
public class BatchData { 

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

Morphia UpdatingでWikiを読むUPDATE ... は「本当に」配列は、このようなIntegerが含まれている場合にのみ、これを行う方法を言ういけない:ここで

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

は私がこれまでにしようとするものです:

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

Filesこのコードの挿入はすでにmongoにあります。 falseはそれを検出せず、アレイの最後に挿入します。 Filesに一意のIDを追加して、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; 
    } 
} 

モンゴの外POJOに(リンクを参照)morphia-mongodb-accessingのような他の回答を読んで、彼はすでに
@Entity BlogEntryを持っています。多分私は同じことをしなければならないでしょうか?
引き出して変更して元に戻しますか?

答えて

6

誰かの喜びのために自分の質問に答える。

私はそれがわからないと思います。
fileObjectsに多くの数字がある場合、テスト中です。Filesです。
fileHashが実際に更新されます。

私はのremoveAllメソッドを使用することができた私の場合は
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

非常にうまく動作します。モルフィアはそれをネイティブにサポートすべきです。この "$"演算子を使用するための検証を無効にする必要があります。 –

1

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

これがMyTypeは、フィールドリストmyEmbeddedListを持っていることを前提とは。リストから削除されるべき声明 "thevalue"があること。

0

私は(ええ、今は)このように、この問題を解決:私は、クエリその後

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

でルートクラスを取得 、私はこのルートクラス内でCRUD操作を実装している(I 「)私のルートクラスを投稿でしょう:一度

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

これはあなたに役立つことを願っています、bye!

関連する問題