Mon goose findOneAndUpdate объект во вложенном массиве - PullRequest
0 голосов
/ 21 апреля 2020

Это моя схема

var tlSchema = new mongoose.Schema({
    _id:String,
    name:String,
    cost:Number,
    rows:Number,
    spr:Number,
    screen:[{
        _id:String,
        date:String,
        time:String,
        layout:[{
            _id:String,
            seatno:String,
            booked:Boolean
    }]
  }]            
})
var tl = mongoose.model("tl",tlSchema);

Я хочу обновить забронированное поле внутри массива макетов внутри экранного массива, это мой запрос

tl.findOneAndUpdate({ "screen._id":"5e9385432bdc30062e22694c","screen.layout._id":"5e9385432bdc30062e226974"},
{"$set":{"screen.0.layout.$.booked":false}}
,function(err,v){
        if(err){console.log(err)}else{
            console.log(v)
        }
})

Я не получаю никакой ошибки, и мои данные не обновляются, пожалуйста, помогите

1 Ответ

0 голосов
/ 23 апреля 2020

То, что вы пытаетесь сделать, это обновить указанный 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)
        }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...