То, что вы пытаетесь сделать, это обновить указанный c элемент в массиве, который содержится в указанном c элементе другого массива.
Вы можете использовать arrayFilters
, чтобы добиться того, что Вы хотите.
Объект параметров здесь определяет 2 фильтра, по одному для каждого массива, а $set
в обновлении использует эти фильтры, чтобы влиять только на соответствующие элементы из каждого массива:
tl.findOneAndUpdate({ "screen._id":"5e9385432bdc30062e22694c","screen.layout._id":"5e9385432bdc30062e226974"},
{"$set":{"screen.$[screenFilter].layout.$[layoutFilter].booked":false}},
{"arrayFilters":[
{"screenFilter._id":"5e9385432bdc30062e22694c"},
{"layoutFilter._id":"5e9385432bdc30062e226974"}
]},
function(err,v){
if(err){console.log(err)}else{
console.log(v)
}
})