Как сохранить вложенное значение, используя Spring-Data для Mongodb - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь обновить следующий документ 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 для обработки установки вложенных полей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...