Как обновить список массивов объектов с определенным индексом в коллекции в Java

#java #spring-boot

#java #spring-boot

Вопрос:

 public Class Customer{
    private long id;
    private String name;
    private String companyName;
    private List<Environment> environment = new ArrayList<>();
}

public Class Environment{
    private int clusterid;
    private string clusterName
}

My Collection in Mongo DB


{  
  "id":1,
  "name":"xyz",
  "companyName":"abc",
  "environment":[
    {
      "clusterid":2,
      "clusterName":"qwe"
    },
    {
      "clusterid":6,
      "clusterName":nme"
    }
  ]
}

 want to update environment List of index 1 with returning whole environment List. How do I do this with spring boot? I want to update particular index of list fetching other too in the collection .

public int updateEnv(Customer customer) {
    Query query = new Query();
    query.addCriteria(Criteria.where("id").is(customer.getid()));
    Update update = new Update();
    update.set("environment", customer.getEnvironment());
    return mongoUtil.update(query, update, Customer.class);
}
  

Этот запрос обновляет весь список среды значением в списке, а не по определенному индексу. Пожалуйста, расскажите о позиционном операторе.Как это сделать с помощью позиционного оператора в Java

Ответ №1:

Вы должны иметь возможность просто передать индекс в update запрос. Итак, если вы хотите обновить / заменить элемент в индексе 1 , вы можете сделать:

 update.set("environment.1", customer.getEnvironment())
  

Комментарии:

1. это будет установлено, когда вы узнаете индекс. Я хочу обновлять динамически

2. Это не совсем то, что указано в вашем вопросе «… хотите обновить .. индекса 1» :). Итак, как бы вы определили индекс? По clusterId ?

3. предположим, в моей коллекции у меня есть среда, которая в основном является arraylist. теперь я хочу запустить запрос на обновление, так instead что из { «id»: 1, «name»: «xyz», «CompanyName»: «abc», «environment»: [ { «clusterid»: 2, «ClusterName»: «qwe» }, { «clusterid»:6, «Имя_кластера»: nme» } ] } ` Я хочу иметь` { «id»: 1, «name»:»xyz», «CompanyName»:»abc», «environment»:[ { «clusterid»:3, «Имя_кластера»: «fgh» },{ «clusterid»:6, «ClusterName»:nme» } ] }

Ответ №2:

Попробуйте этот обновленный запрос.

Обновлена игровая площадка Mongo

 db.collection.update({
  id: 1/**customer id*/
  
},
{
  "$set": {
    "environment.$[element]": {
      "clusterId": 4,
      /**environment object with updated clusterId*/
      "clusterName": "asd"/**environment object with updated clusterName*/
      
    }
  }
},
{
  arrayFilters: [
    {
      "element.clusterid": 6/**clusterId of environment you have to update*/
      
    }
  ]
})
  

Комментарии:

1. Я привел пример коллекции выше, в которой приведен список среды, я хочу обновить весь, например, вместо { «clusterid»:6, «ClusterName»: nme» } , я хочу обновить {«clusterid»: 4, «ClusterName»:»asd»}.

2. Хорошо, круто. Вот что я понял. Скажите мне, если я ошибаюсь. ИТАК, у нас есть информация о том, какой объект правильно обновлять? Как и в вашем комментарии, мы знаем, что хотим обновить ` { «clusterid»: 6, «ClusterName»: nme» }` с помощью {"clusterid":4,"clusterName":"asd"}

3. да, я прошел позиционный набор и все, но не смог понять идею написания запроса на Java

4. Обновлен запрос. Можно запустить и проверить, соответствует ли это вашим ожиданиям.

5. Как только мы получим ожидаемый результат. Мы можем работать над преобразованием его в java