В Morphia, как я могу обновить один встроенный объект внутри ArrayList - PullRequest
3 голосов
/ 09 февраля 2012

Действительно новичок в использовании Mongodb с Morphia и посмотрите много сложных ответов, как это сделать.

Я хочу сделать это просто, если это возможно, и у меня есть @Embedded Объект с именем
fileObjects содержит Files объектов.

Я не могу обновить поля внутри Files.

Я хочу обновить только одно поле, например 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, который этот код вставки уже находится в монго. false не обнаруживает это и вставляет его в конец массива. Могу ли я добавить уникальный идентификатор к 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 за пределами Монго. Может быть, я должен сделать то же самое?
Вытащить, заменить и сохранить обратно?

Ответы [ 3 ]

6 голосов
/ 10 февраля 2012

Отвечая на мой вопрос для чьего-либо удовольствия.

Думаю, я решил, что не уверен.
Похоже, что он работает, я тестирую, когда у 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);
1 голос
/ 31 августа 2013

В моем случае я смог использовать метод removeAll:

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

Это предполагает, что MyType имеет поле List myEmbeddedList;и что есть vlue "thevalue", который будет удален из списка.

0 голосов
/ 20 октября 2015

Я просто (да, прямо сейчас) решил эту проблему следующим образом: я получаю корневой класс с запросом

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

Надеюсь, это поможетпока!

...