MongoDB / Mon goose отношение один ко многим - PullRequest
1 голос
/ 28 февраля 2020

Работа над структурой базы данных для нового проекта и попытка выяснить, как именно работают отношения один-ко-многим в MongoDB / mon goose.

Итак, учитывая следующую простую структуру:

У меня есть таблица / схема проекта с несколькими изображениями, связанными с ней:

const ProjectSchema = mongoose.Schema({
    _id: mongoose.Types.ObjectId, // Just the id,
    name: { type: String, required: true, trim: true,  maxLength: 60 },
    description: { type: String, required: false }, 
    images: [{ 
        type: Schema.Types.ObjectId, ref: 'Image'
    }]
});

А затем таблица / схема изображения:

const ImageSchema = new Schema({
    _id: mongoose.Types.ObjectId, // Just the id,
    url: { type: String, unique: true, required: true }
    project: { 
        type: Schema.Types.ObjectId, ref: 'Project'
    }        
});

Я хочу один-ко-многим между изображениями и проектами, поэтому я сохраняю изображение с идентификатором проекта:

const image = new Image(
        {
                project: project._id,
                _id: new mongoose.Types.ObjectId(),
                url: 'https://someurl',
        });        
        await image.save();

Если я найду это изображение и заполню поле поле проекта - оно содержит всю информацию о проекте, НО, если я найду этот проект, у него ничего нет в массиве изображений (ссылка на изображение):

images: [{ 
        type: Schema.Types.ObjectId, ref: 'Image'
    }]

Я думал, что с ref вы создавая ссылку на внешний ключ между Project и Image, и тогда оба Image должны иметь связанный Project, а Project должен видеть связанное изображение в массиве. Это не тот случай, или я что-то здесь упускаю?

1 Ответ

1 голос
/ 28 февраля 2020

Вы должны быть в состоянии заполнить изображения из проекта без проблем.

Допустим, у вас есть этот документ проекта:

{
    "_id" : ObjectId("5e592a438b93764a40a81a96"),
    "images" : [
        ObjectId("5e592aba8b93764a40a81a98"),
        ObjectId("5e592ac78b93764a40a81a99")
    ],
    "name" : "Project 1",
    "__v" : 0
}

И эти документы изображений:

{
    "_id" : ObjectId("5e592ac78b93764a40a81a99"),
    "url" : "Url 2",
    "project" : ObjectId("5e592a438b93764a40a81a96"),
    "__v" : 0
},
{
    "_id" : ObjectId("5e592aba8b93764a40a81a98"),
    "url" : "Url 1",
    "project" : ObjectId("5e592a438b93764a40a81a96"),
    "__v" : 0
}

Мы можем использовать следующий код для заполнения изображений:

router.get("/projects/:id", async (req, res) => {
  const result = await Project.findById(req.params.id).populate("images");
  res.send(result);
});

Это даст такой результат:

{
    "images": [
        {
            "_id": "5e592aba8b93764a40a81a98",
            "url": "Url 1",
            "project": "5e592a438b93764a40a81a96",
            "__v": 0
        },
        {
            "_id": "5e592ac78b93764a40a81a99",
            "url": "Url 2",
            "project": "5e592a438b93764a40a81a96",
            "__v": 0
        }
    ],
    "_id": "5e592a438b93764a40a81a96",
    "name": "Project 1",
    "__v": 0
}

Итак, для вашего случая проверьте, действительно ли документ вашего проекта содержит массив изображений с идентификаторами объектов для документов изображений, и вы заполняете правильно.

Также вам не нужно добавлять поля _id в схему, mongodb сам сгенерирует _id автоматически.

проект

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

const ProjectSchema = Schema({
  name: { type: String, required: true, trim: true, maxLength: 60 },
  description: { type: String, required: false },
  images: [
    {
      type: Schema.Types.ObjectId,
      ref: "Image"
    }
  ]
});

module.exports = mongoose.model("Project", ProjectSchema);

image

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

const ImageSchema = new Schema({
  url: { type: String, unique: true, required: true },
  project: {
    type: Schema.Types.ObjectId,
    ref: "Project"
  }
});

module.exports = mongoose.model("Image", ImageSchema);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...