嵌套数组内的猫鼬findOneAndUpdate对象

时间:2020-04-21 14:53:55

标签: node.js mongodb express mongoose

这是我的模式

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 :(得分:0)

您要执行的操作是更新另一个数组的特定元素中包含的数组中的特定元素。

您可以使用arrayFilters来实现所需的目标。

此处的options对象定义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)
        }
})