Как мне создать связь OneToMany между двумя схемами Mongoose?

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #mongoose

Вопрос:

У меня есть две модели, каждая в своем собственном файле js в одном каталоге. Одна называется Place (для приложения для списка списков путешествий), а другая называется Country . Страна имеет URL-адрес изображения своего флага в качестве ключевого flagURL. Я хочу заполнить ключ Place «flag» значением flagURL из Country . Каков наилучший способ сделать это?

Модель размещения

 const mongoose = require('mongoose');

const placeSchema = new mongoose.Schema({
    city: String,
    country: String,
    img: String, // this is for an image of the place, not the flag
    flag: 'flagImg URL Here',
    visited: Boolean,
});

const Place = mongoose.model('Place', placeSchema);

module.exports = Place;
 

Модель страны

 const mongoose = require('mongoose');

const countrySchema = new mongoose.Schema({
    countryName: String,
    countryCode: String,
    flagImg: String
});

const Country = mongoose.model('Country', countrySchema);

module.exports = Country;
 

Спасибо за помощь в моем вопросе для начинающих!

Комментарии:

1. как место ссылается на страну? По какому пути в схеме Country? countryName или countryCode или, может быть, даже _id ? Это непонятно, потому что в нем просто написано country in placeSchema .

Ответ №1:

Вам нужно будет ссылаться на схему страны в вашей схеме места (чтобы получить страну, связанную с этим конкретным местом).

 const mongoose = require('mongoose');

const placeSchema = new mongoose.Schema({
    city: String,
    img: String, // this is for an image of the place, not the flag
    visited: Boolean,
    country: {
      type:mongoose.Schema.ObjectId, 
      ref: 'Country',
      required: [true, 'A place must have a country']
     
 }
});

const Place = mongoose.model('Place', placeSchema);

module.exports = Place;
 

Свойство country предоставит вам доступ ко всем значениям свойств схемы country, относящимся к определенному месту.

Ваша полезная нагрузка будет такой:

 {
  "city": "califonia",,
  "img": dafault.png, // this is for an image of the place, not the flag
  "visited": true,
  "country": {
     "countryName": "United States of America",
     "countryCode": US,
     "flagImg": dafault.png, // the country's flag
  }
}