繁体   English   中英

Mongoose 一对多关系问题

[英]Mongoose one to many relationship issue

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

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)

我正在创建一个用户和一辆汽车 model 并将用户 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()
})

这可行,但如果我需要对一辆汽车 model 执行操作,那么它显然不会反映在用户汽车阵列上,我必须单独进行,即模型没有“实际”链接。 我怎样才能做到这一点,以便在 Car model 上执行删除之类的操作会自动将其从我的用户汽车阵列中删除。 任何帮助将不胜感激。

移除汽车后,无法自动从用户那里删除汽车。 所以你需要对这两个文件进行操作。

但是有一种更简单的方法,只有父引用。 不要在用户 model 中保留汽车引用,并使用虚拟填充来填充来自用户的汽车。

以下是步骤:

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);

请注意,我删除了 cars 字段,在 schema 中添加了toJSON: { virtuals: true }选项,设置了 virtual。 (也将年龄类型修改为数字)。

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-) 现在我们可以使用填充从用户那里填充汽车:

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");
  }
});

这将给出 output:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM