У меня есть модель данных со следующей структурой:
{
_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
генерирует неверный запрос, который не выполняется (очевидно).