我如何为此设计架构?

我正在开发一个 MERN 应用程序。我需要为相当简单的移动商店网站设计架构。


数据应采用以下格式


    {

  [

    "IOS":[

      "Apple":[

        {

          "model":"Iphone6"

        },

        {

          "model":"Iphone7"

        }

      ]

    ],

    "Android":[

      "Samsung":[

        {

          "model":"S6"

        },

        {

          "model":"S7"

        }

      ],

      "OnePlus":[

        {

          "model":"oneplu6"

        },

        {

          "model":"onplus7"

        }

      ]

    ],

    "Windows":[

      "Nokia":[

        {

          "model":"Nokia 7.2"

        }

      ]

    ]

  ]

}

我如何在 mongo/mongoose 中为此设计模式?


慕丝7291255
浏览 133回答 1
1回答

森林海

如果不需要使用操作系统和品牌名称作为键,我有这样的解决方案。我会像这样设置我的模式:const mongoose = require("mongoose");const operatingSystemSchema = new mongoose.Schema({  name: {    type: String,    required: true  }});const brandSchema = new mongoose.Schema({  name: {    type: String,    required: true  }});const productSchema = new mongoose.Schema({  model: {    type: String,    required: true  },  operatingSystem: {    type: mongoose.Schema.Types.ObjectId,    ref: "OperatingSystem"  },  brand: {    type: mongoose.Schema.Types.ObjectId,    ref: "Brand"  }});module.exports = {  OperatingSystem: mongoose.model("OperatingSystem", operatingSystemSchema),  Brand: mongoose.model("Brand", brandSchema),  Product: mongoose.model("Product", productSchema)};根据模式插入文档后,我们可以使用以下聚合按操作系统和品牌进行分组:db.products.aggregate([  {    $lookup: {      from: "operatingsystems",      localField: "operatingSystem",      foreignField: "_id",      as: "operatingSystems"    }  },  {    $lookup: {      from: "brands",      localField: "brand",      foreignField: "_id",      as: "brands"    }  },  {    $unwind: "$operatingSystems"  },  {    $unwind: "$brands"  },  {    $replaceRoot: {      newRoot: {        $mergeObjects: [          "$$ROOT",          {            operatingSystem: "$operatingSystems.name",            brand: "$brands.name"          }        ]      }    }  },  {    $project: {      brands: 0,      operatingSystems: 0    }  },  {    $group: {      _id: {        "operatingSystem": "$operatingSystem",        "brand": "$brand",      },      products: {        $push: "$$ROOT"      }    }  },  {    $group: {      "_id": "$_id.operatingSystem",      "data": {        "$push": {          "brand": "$_id.brand",          "models": "$products.model"        }      }    }  },  {    $project: {      "OS": "$_id",      "_id": 0,      "data": 1    }  }])操场以及快递方面的示例路线:router.get("/", async (req, res) => {  const result = await Product.aggregate([    {      $lookup: {        from: "operatingsystems",        localField: "operatingSystem",        foreignField: "_id",        as: "operatingSystems"      }    },    {      $lookup: {        from: "brands",        localField: "brand",        foreignField: "_id",        as: "brands"      }    },    {      $unwind: "$operatingSystems"    },    {      $unwind: "$brands"    },    {      $replaceRoot: {        newRoot: {          $mergeObjects: [            "$$ROOT",            {              operatingSystem: "$operatingSystems.name",              brand: "$brands.name"            }          ]        }      }    },    {      $project: {        brands: 0,        operatingSystems: 0      }    },    {      $group: {        _id: {          operatingSystem: "$operatingSystem",          brand: "$brand"        },        products: {          $push: "$$ROOT"        }      }    },    {      $group: {        _id: "$_id.operatingSystem",        data: {          $push: {            brand: "$_id.brand",            models: "$products.model"          }        }      }    },    {      $project: {        OS: "$_id",        _id: 0,        data: 1      }    }  ]);  res.send(result);});结果将如下所示:[  {    "OS": "Windows",    "data": [      {        "brand": "Nokia",        "models": [          "Nokia 7.2"        ]      }    ]  },  {    "OS": "Android",    "data": [      {        "brand": "OnePlus",        "models": [          "oneplus7",          "oneplu6"        ]      },      {        "brand": "Samsung",        "models": [          "S7",          "S6"        ]      }    ]  },  {    "OS": "IOS",    "data": [      {        "brand": "Apple",        "models": [          "Iphone7",          "Iphone6"        ]      }    ]  }]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript