gpt4 book ai didi

javascript - 我如何为此设计架构?

转载 作者:行者123 更新时间:2023-12-02 22:27:58 24 4
gpt4 key购买 nike

我正在开发一个 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 中为此设计架构?

最佳答案

如果不需要使用操作系统和品牌名称作为 key ,我有这样的解决方案。

我会像这样设置我的架构:

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
}
}
])

Playground

以及 express 方面的示例路线:

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"
]
}
]
}
]

关于javascript - 我如何为此设计架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com