Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose一对多关系问题_Javascript_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript Mongoose一对多关系问题

Javascript Mongoose一对多关系问题,javascript,mongodb,express,mongoose,Javascript,Mongodb,Express,Mongoose,我有一个用户模型和一个汽车模型。一个用户可以有多辆车。这是代码- let UserSchema = new Schema({ name:String, age:String, cars:[{ type:Schema.Types.ObjectId, ref:"Car" }] }) const User = mongoose.model("User",UserSchema) let CarSchema = new Schema({

我有一个用户模型和一个汽车模型。一个用户可以有多辆车。这是代码-

let UserSchema = new Schema({
    name:String,
    age:String,
    cars:[{
        type:Schema.Types.ObjectId,
        ref:"Car"
    }]
})

const User = mongoose.model("User",UserSchema)

let CarSchema = new Schema({
    make:String,
    model:String,
    owner:{
        type:Schema.Types.ObjectId,
        ref:"User"
    }
})

const Car = mongoose.model("Car",CarSchema)

我正在创建一个用户和一个汽车模型,并将用户id存储在汽车中,反之亦然,如下所示-

const user = new User({
    _id: new mongoose.Types.ObjectId(),
    name:'Raj',
    age:50
})

user.save(function(err){
    if(err){
        console.log(err)
    }
    const car1 = new Car({
        make:'Toyota',
        model:'568',
        owner:user._id
    })
    car1.save(function(err){
        if(err){
            console.log(err)
        }
    }) 
    user.cars.push(car1)
    user.save()
})

这是可行的,但如果我需要对一个汽车模型执行操作,那么它显然不会反映在用户汽车阵列上,我必须单独执行,即模型没有“实际”链接。我如何使其能够在汽车模型上执行类似删除的操作,从而自动将其从我的用户汽车阵列中删除。任何帮助都将不胜感激。

当车辆被移除时,用户无法自动删除车辆。 因此,您需要对这两个文档进行操作

但是有一种更简单的方法,只使用父引用。不要在用户模型中保留汽车参考,并使用从用户模型中填充汽车

以下是步骤:

1-)更改用户架构以设置虚拟填充:

var mongoose=require(“mongoose”);
var Schema=mongoose.Schema;
让UserSchema=newschema(
{
名称:String,
年龄:数字,,
},
{
toJSON:{virtuals:true},
}
);
UserSchema.virtual(“汽车”{
参考:“汽车”,
localField:“\u id”,
外域:“所有者”,
});
const User=mongoose.model(“User”,UserSchema);
注意,我删除了cars字段,在模式setup virtual中添加了
toJSON:{virtuals:true}
选项。(还将年龄类型修改为数字)

2-)现在我们可以创建这样的用户和汽车:

router.post(“/users”),异步(req,res)=>{
const user=新用户({姓名:“Raj”,年龄:50});
试一试{
等待user.save();
const car1=新车({
制造:“丰田”,
型号:“568”,
所有者:用户。\u id,
});
等待car1.save();
res.send(“用户和车辆已保存”);
}捕捉(错误){
控制台日志(err);
res.status(500)。发送(“出错”);
}
});
正如你所看到的,我们需要2分贝的操作,而不是3分贝,因为我们不需要把车推到用户的车上并保存

3-)现在,我们可以使用“填充”从用户处填充汽车:

router.get(“/users/:id”),异步(req,res)=>{
试一试{
const user=wait user.findById(req.params.id).populate(“cars”);
res.send(用户);
}捕捉(错误){
控制台日志(err);
res.status(500)。发送(“出错”);
}
});
这将提供以下输出:

{
    "_id": "5ea685a3f1a0b02db8aaffe2",
    "name": "Raj",
    "age": 50,
    "__v": 0,
    "cars": [
        {
            "_id": "5ea685a5f1a0b02db8aaffe3",
            "make": "Toyota",
            "model": "568",
            "owner": "5ea685a3f1a0b02db8aaffe2",
            "__v": 0
        }
    ],
    "id": "5ea685a3f1a0b02db8aaffe2"
}

非常感谢!现在需要明确的是,我只需要在用户模型中的cars数组上执行操作,就可以在将来创建/删除/更新任何汽车,而无需在其他地方,对吗?@SushmitChakraborty不,您只需要在cars集合中添加、删除或删除汽车。我猜答案中的输出让你困惑,输出是人口的结果。