Spring-Mon go -Data Update допускает только один позиционный аргумент? - PullRequest
1 голос
/ 28 апреля 2020

У меня есть модель данных со следующей структурой:

{
    _id: ObjectId(''),
    strs: [
        {
            _id: ObjectId(''),
            nds: [
                {
                    _id: ObjectId(''),
                    title: ''
                },
                .
                .
                .
            ]
        },
        .
        .
        .
    ]
}

Следующий запрос прекрасно работает в mongo shell:

mongo.update({_id: ObjectId(''), 'strs._id': ObjectId(''), 'strs.nds._id': ObjectId('')}, {$set: {'strs.$.nds.$.title': 'new-title'}})

Я пытаюсь сделать то же самое в Spring Boot, я написал следующие строки кода:

Criteria criteria = new Criteria();
criteria.addOperator(Criteria.where("id").is(id), 
    Criteria.where("strs.id").is(strsId), Criteria.where("strs.nds.id", ndsId));
Query query = new Query().addCriteria(criteria);
Update update = new Update();
update.set("strs.$.nds.$.title", title);
mongoTemplate.findAndModify(query, update, MyModel.class);

Но это не работает, как ожидалось. Он говорит, что mongo не может создать поле title внутри [nds: {...}]. Итак, я зарегистрировал запросы, генерируемые MongoTemplate, и оказалось, что MongoTemplate удалял второй позиционный аргумент $ из запроса.

Это был сгенерированный запрос:

mongo.update({...}, {$set: {'strs.$.nds.title': 'new-title'}})

И именно по этой причине mongo выдавал исключение о том, что он не может создать поле title в массиве.

Я делаю это неправильно? Потому что MongoTemplate генерирует неверный запрос, который не выполняется (очевидно).

1 Ответ

1 голос
/ 28 апреля 2020

Что вы можете сделать, это

update.set("strs.$[elmStr].nds.$[elmNds].title", title)
    .filterArray("elmStr._id", strsId)
    .filterArray("elmNds._id",ndsId);

И см. позиционный оператор

...