Я пытаюсь обновить следующий документ JSON в mongodb, чтобы новый документ был создан, если нет документа, соответствующего «altKey», но если документ, соответствующий altKey, будет иметь любые соответствующие «записи» их набор "доменов" и их "число" увеличены. У меня есть требование, чтобы структура JSON не менялась и использовался Spring-Data для mongodb.
{
"altKey": "value"
"records": {
"randomName1" {
"domain": "domainValue",
"count": 3
},
"randomName2" {
"domain": "domainValue2",
"count": 5
},
...
"randomNameN" {
"domain": "domainValueN",
"count": 4
}
}
}
Соответствующая часть класса, с которой я пытался выполнить обновление:
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void increment(Doc doc) {
Query query = new Query().addCriteria(Criteria.where("altKey").is(doc.getAltKey());
Update update = new Update();
update.setOnInsert("altKey", doc.getAltKey());
for (final Map.Entry<String, RecordData> entry :
doc.getRecords().entrySet()) {
String domainKey = format("records.{0}.domain", entry.getKey());
String domainValue = entry.getValue().getDomain();
update.set(domainKey, domainValue);
String countKey = format("records.{0}.count", entry.getKey());
Integer countValue = entry.getValue().getCount();
update.inc(countKey, countValue);
}
mongoTemplate.upsert(query, update, Doc.class);
}
Когда я пытаюсь вызвать метод приращения, поле «altKey» успешно сохраняется, но ни одна из записей не сохраняется, и я не уверен, почему это так. Я полагаю, что причина - моя попытка использовать операцию mongo dot для ключа при выполнении частей обновления set и inc (то есть «records.randomNameN.domain» или «records.randomNameN.count»), но я не смог найти альтернативный способ настройки объекта Update, если до момента выполнения я не знаю, как будет называться имя конкретной записи.
Кто-нибудь знает, как настроить объект Update для обработки установки вложенных полей?