gpt4 book ai didi

javascript - Mongoose 一对多关系问题

转载 作者:行者123 更新时间:2023-12-04 10:08:30 24 4
gpt4 key购买 nike

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

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()
})

这有效,但如果我需要对一个汽车模型执行操作,那么它显然不会反射(reflect)在用户汽车数组上,我必须单独执行,即模型没有“实际”链接。我如何才能使在 Car 模型上执行诸如删除之类的操作会自动将其从我的用户汽车阵列中删除。任何帮助将不胜感激,谢谢。

最佳答案

当汽车被移除时,没有自动删除用户的汽车的方法。
所以你需要对这两个文件进行操作。

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

以下是步骤:

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

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

let UserSchema = new Schema(
{
name: String,
age: Number,
},
{
toJSON: { virtuals: true },
}
);

UserSchema.virtual("cars", {
ref: "Car",
localField: "_id",
foreignField: "owner",
});

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

请注意,我删除了汽车字段,添加了 toJSON: { virtuals: true }模式中的选项,设置虚拟。 (也将年龄类型修改为数字)。

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

router.post("/users", async (req, res) => {
const user = new User({ name: "Raj", age: 50 });

try {
await user.save();

const car1 = new Car({
make: "Toyota",
model: "568",
owner: user._id,
});

await car1.save();

res.send("User and car saved");
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});

如您所见,我们需要 2 个 db 操作而不是 3 个,因为我们不需要将汽车推到用户的汽车上并保存。

3-) 现在我们可以使用 populate 从用户那里填充汽车:

router.get("/users/:id", async (req, res) => {
try {
const user = await User.findById(req.params.id).populate("cars");

res.send(user);
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});

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

关于javascript - Mongoose 一对多关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61453039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com