MongoTemplate — обновить запись во вложенном массиве

Я пытаюсь обновить запись (propertyOne) во вложенном массиве.

Структура выглядит следующим образом:

Структура объекта

Обновление имени записи в списке элементов уже работает:

    ...

    fileRepositoryEntity.updateNestedObject("randomitemid", "randompropertyid")
    
    ...

    override fun updateNestedObject(id1list: String, id2list: String): Mono<FileEntity>  {

       val cX = Criteria.where("testobj.itemList._id").`is`(id1list)
       var qX = query(cX)
       val uX: Update = Update().set("testobj.itemList.$.name", "newname")

       return mongoTemplate.findAndModify(qX,uX,FileEntity::class.javaObjectType);
    }

Но как мне обновить propertyOne?


person Manfred Mustermann    schedule 25.06.2020    source источник


Ответы (1)


Похоже, я нашел решение (Обновить только определенный вложенный документ глубоко во вложенном массиве массива документов)

override fun updateNestedObject(id1list: String, id2list: String): Mono<FileEntity>  {

    val c2 = Criteria.where("testobj.itemList.propertyList._id").`is`(id2list)
    var q2 = query(c2)
    val fA1 = Criteria.where("elem1._id").isEqualTo(id1list)
    val fA2 = Criteria.where("elem2._id").isEqualTo(id2list)
    val u2: Update = Update().set("testobj.itemList.$[elem1].propertyList.$[elem2].propertyOne", "newPropertyVaue").filterArray(fA1).filterArray(fA2)
    return mongoTemplate.findAndModify(q2,u2,FileEntity::class.javaObjectType);

}
person Manfred Mustermann    schedule 25.06.2020
comment
Если бы в обоих списках (itemList и propertyList) было бы свойство One, возникла бы ошибка - person Manfred Mustermann; 26.06.2020
comment
В этом случае вы можете использовать следующее: val u2: Update = Update().set(testobj.itemList.$.propertyList.$[elem2].propertyOne, newPropertyVaue).filterArray(fA2) - person Manfred Mustermann; 29.06.2020