使用arrayFilters来更新嵌套对象数组中对象的属性,使用Mongoose

sshcrbum  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(188)

我在MongoDb中有一个集合,其中包含文档“flights”,其中包含一个对象的字段数组。我想一次更新一个对象的一个属性。为此,我必须使用两个过滤器:一个用于选择要更新的文档,另一个用于选择数组中的对象。
我将arrayFilters与Mongoose一起使用,如下所示:
这是我的飞行模式
第一个
假设我想将sitNumber对象中的属性IsSuspended从false更新为true:2.

//Controllers dashboard.js

blockSit : async (req, res) => {
    try {
        const flight = req.body.flightName
            
        const sit = req.body.sitToBlock //sit es 2 
            
        const updateSit = await Flight.updateOne(
            { "flightName": flight},

            { "$set" : {"sits.$[si].isSuspended": true} }, 

            { "arrayFilters": [{ "si.sitNumber": sit} ]}
        )
                
        console.log(updateSit) 
    } catch (error) {
        console.log(error)
    }
}

就我所见,我的sintaxis是正确的。但是我一直收到下面的错误信息:

Error: Could not find path "sits.0.sitNumber" in schema

我不一定要使用arrayfilters。我愿意尝试任何其他允许我用mongoose更新对象嵌套数组中的属性的解决方案。

ztmd8pv5

ztmd8pv51#

sits字段似乎是子文档数组,但没有描述这些字段的架构。请尝试定义架构。

const sitSchema = new Schema({
  sitNumber: Number,
  isAvailable: Boolean,
  isSuspended: Boolean,
  // etc
});

// in the flight schema

  sits: [sitSchema],
hwamh0ep

hwamh0ep2#

我是这样解决的:
首先,我需要在Mongoose中使用方法findOneandUpdate。另外,我在arrayFilters中添加了属性new并将其设置为true。

blockSit : async (req, res) =>{
        try {
            const flight = req.body.flightName
            console.log(flight)
            const sit = req.body.sit
            console.log(sit)
            const updateSit = await Flight.findOneAndUpdate(
                {"flightName" :  flight},
                { "$set" : {"sits.$[si].isSuspended" : true, "sits.$[si].isAvailable": false} }, 
                {"arrayFilters" :[ { "si.sitNumber" :sit} ], new : true}

            )
            
         
                
            res.send(updateSit)

            
        } 
        catch (error) {
            console.log(error)
        }
    },

相关问题