猫鼬一对多关系

时间:2021-06-01 18:30:26

标签: javascript mongodb express mongoose mongoose-schema

我正在尝试在 CategoryServices 模型之间创建一对多关系。

我有两个模式:CategoryService

Category 架构包含 services 数组。

Service 架构持有 category _id。

我正在尝试检索包括 Categories 在内的所有 services

Category 架构:

import mongoose from 'mongoose';

const categoriesModel = new mongoose.Schema(
    {
        category: {
            type: String,
            required: true,
        },
        services: [{ type: mongoose.SchemaTypes.ObjectId, ref: 'Service' }],
    },
    { timestamps: true }
);

export const Category = mongoose.model('Category', categoriesModel);

Service 架构:

import mongoose from 'mongoose';

const serviceSchema = new mongoose.Schema(
    {
        serviceName: {
            type: String,
            required: true,
        },
        description: {
            type: String,
            required: true,
        },
        images: {
            type: Array,
            image: Buffer,
            required: true,
        },
        category: {
            type: mongoose.SchemaTypes.ObjectId,
            ref: 'Category',
            required: true,
        },
    },
    { timestamps: true }
);

export const Service = mongoose.model('Service', serviceSchema);

用于检索所有 Categories 包括 Services 的 HTTP 获取请求:

export const getAllCategories = async (req, res) => {
    try {
        const docs = await Category.find({}).populate({
            path: 'services',
            model: 'Service',
        });
        console.log(docs);
        res.status(200).json({ data: docs });
    } catch (err) {
        res.status(400).json(err.message);
    }
};

这是我从上述请求中得到的响应:

  {
            "services": [],
            "_id": "60affe06c71901281d3d820d",
            "category": "Electricity"
  },

我尝试了不同的方法来populate services,但都没有奏效。

到目前为止我尝试过的:

  1. services 属性添加额外的嵌套。

  2. populate 参数添加对象:

    {
             path: 'services',
             model: 'Service',
    }
    
  3. 删除现有数据并发布额外数据。

有趣的事实。单独检索每个 Serviceservice 数据包括它被分配到的实际类别:

 export const getAllServices = async (req, res) => {
        try {
            const doc = await Service.find({}).populate('category');
            res.status(200).json({ data: doc });
        } catch (err) {
            res.status(400).json(err);
        }
    };

关于在检索 services 中包含 categories 有什么我遗漏的吗?这真的很有趣,因为不知何故实际的 services 数据是 []

EDITcategory 集合中的每个 Categories 都有空的 services 数组。 services 是动态添加的,对于特定的 null,它们可能是 category,直到用户添加服务并为其分配 category。这是禁止的吗?在创建新的 category 时,我是否需要查找特定的 service 并将特定的 category 添加到 service?如果是,则需要向 Category 添加额外的 services.controller.js 模型并找到 category。这真的是一个合适的解决方案吗?

0 个答案:

没有答案