Пн goose проблема отношения один ко многим - PullRequest
2 голосов
/ 27 апреля 2020

У меня есть модель пользователя и модель автомобиля. Один пользователь может иметь несколько автомобилей. Вот код -

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)

Я создаю пользователя и модель автомобиля и сохраняю идентификатор пользователя в автомобиле и наоборот, как это -

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 Ответ

2 голосов
/ 27 апреля 2020

Не существует автоматического c способа удаления автомобилей у пользователя при его удалении. Таким образом, вам нужно выполнить операцию с обоими документами.

Но есть более простой способ с использованием только родительских ссылок. Не сохраняйте ссылки на автомобили в пользовательской модели и используйте виртуальное заполнение для заполнения автомобилей от пользователя.

Вот шаги:

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, добавил опцию toJSON: { virtuals: true } в схему, настроил virtual. (также изменил тип возраста как Number).

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 дБ вместо 3, поскольку нам не нужно отправлять sh машину на машины пользователя и сохранять.

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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...