Обновление MongoTemplate устанавливает несколько объектов в массиве для одного документа - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть конечная точка, которая принимает идентификатор документа, и объект Employee во вложенном массиве, который я хотел бы обновить. Это работает нормально. Я попытался изменить конечную точку, чтобы она заняла более 1 сотрудника, и он обновил их все сразу, но не могу заставить ее работать. Я не уверен, что у меня неправильный формат или это невозможно.

Для уточнения, моя перепись - это уже существующий объект, в котором 10 сотрудников в списке:

{
  "id": <ID>
  ...
  "employeeList": [
  {
    "employeeId": <Employee_ID>,
    ...
  }
  ...
  ]
}

Я хочу обновить существующего сотрудника новой информацией. Поэтому я использую mon go Document ID, чтобы найти документ, а затем нахожу правильного Employee в списке по его EmployeeID. У меня это работает с чем-то вроде этого для одного обновления сотрудника:

Query query = new Query().addCriteria(new Criteria("id").is(id))
      .addCriteria(new Criteria("employeeList.employeeId").is(employee.getEmployeeId());
update.set("employeeList.$", employee);

UpdateResult result = mongoTemplate.updateFirst(query, update, Census.class);

Когда я пытался обновить его, чтобы сделать их все сразу, это не сработало. Теперь я понимаю, что мой подход на самом деле не имеет смысла, поэтому я не буду публиковать его (в основном окружая .addCriteria и update.set в для l oop, чтобы сделать это для каждого сотрудника в представленном списке). Возникла ошибка вроде: «Из-за ограничений com.mongodb.BasicDocument вы не можете добавить второй критерий employeeList.employeeId».

Можно ли это сделать? Является ли единственный другой вариант, чтобы просто обновить этот документ несколько раз подряд? Я думаю, что лучше сделать это, чем вызывать конечную точку X раз. Я в понедельник go 3,6 в случае, если это влияет на любые ответы. ТИА.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Вот пример обновления поля: плакат для выбранного заголовка:

db.movieDetails.updateOne(

{title: "Марсианин"},
{$ set: {poster: "http://ia.media-etc. "}}

Также есть обновлениеMany Вам следует ознакомиться с электронным руководством пользователя * go ....

0 голосов
/ 13 февраля 2020

Мне не удалось найти другого ответа на мой вопрос. Поэтому я в итоге изменил его на подход массового обновления:

BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.UNORDERED, Census.class);
for(Employee employee : employeeList) {
    Query query = new Query().addCriteria(new Criteria("id").is(id));
    Update update = new Update().set("employeeList.$", employee);
    bulkOps.updateOne(query, update);
}
BulkWriteResult results = bulkOps.execute();

На самом деле это не решает вопрос о попытке обновить один и тот же документ несколько раз, но пока работает для меня.

0 голосов
/ 11 февраля 2020

извините, но ваш пост не понятен. Вы отображаете поле массива EmployeeList - вы пытаетесь добавить значение в массив? одного документа или всех документов?

если не добавлять значение в это существующее поле массива - тогда вместо этого вы хотите добавить новое поле ко всем документам?

...