首页 > 解决方案 > Mongoose 和 NodeJS 中嵌套数组的问题

问题描述

我有这个复杂的类别模式,其中包含一组子类别,每个子类别都有一组书籍..

有人可以帮我为此类别架构发出正确的 POST 请求,我希望请求正文看起来像该架构以包含嵌套在其中的类别一个嵌套在每个子类别中的子类别数组一个带有MongooseNodeJS的书籍数组。这是架构:-

{
    "categoryName": "engineering",
    "subcategories": [
        {
            "subcategoryName": "chemical enginnering",
            "books": [
                {
                    "bookName": "",
                    "author": "",
                    "ratings": [3, 4, 5, 3],
                    "feedbcks": ["awesome book", "very amazing book"],
                    "price": 222
                }
            ]
        },
        {
            "subcategoryName": "mechanical engineering",
            "books": [
                {
                    "bookName": "",
                    "author": "",
                    "ratings": [3, 4, 5, 3],
                    "feedbcks": ["awesome book", "very amazing book"],
                    "price": 222
                }
            ]
        }
    ]
}

我尝试了这段代码,但没有成功

const category = new Category({
    categoryName: req.body.categoryName,
    subcategories: [
      new SubCategory({
        subCategoryName: req.body.subCategoryName,
        books: [
          new Book({
            bookName: req.body.bookName,
            price: req.body.price,
            ratings: req.body.ratings,
            feedbacks: req.body.feedbacks,
            author: req.body.author
          })
        ]
      })
    ]
  });

  try {
    const savedCategory = await category.save();
    res.send(savedCategory);
  } catch (error) {
    res.send(error.message);
  }

标签: node.jspostmongoosemongoose-schema

解决方案


我相信您的架构可能看起来像这样(子文档):

const Category = new Schema({
    categoryName: String,
    subcategories: [{
        subcategoryName: String,
        books: [{
            bookName: String,
            author: String,
            ratings: Array,
            feedbacks: Array,
            price: Number
        }]
    }]
})

或者

const Book = new Schema({
    bookName: String,
    author: String,
    ratings: Array,
    feedbacks: Array,
    price: Number
})

const Subcategory = new Schema({
    subcategoryName: String,
    books: [Book]  
})

const Category = new Schema({
    categoryName: String,
    subcategories: [Subcategory]
})

为了保存它,我认为您可以将整个数据对象传递到您的Model

const category = {
    "categoryName": "engineering",
    "subcategories": [
        {
            "subcategoryName": "chemical enginnering",
            "books": [
                {
                    "bookName": "",
                    "author": "",
                    "ratings": [3, 4, 5, 3],
                    "feedbacks": ["awesome book", "very amazing book"],
                    "price": 222
                }
            ]
        },
        {
            "subcategoryName": "mechanical engineering",
            "books": [
                {
                    "bookName": "",
                    "author": "",
                    "ratings": [3, 4, 5, 3],
                    "feedbacks": ["awesome book", "very amazing book"],
                    "price": 222
                }
            ]
        }
    ]
}


const newCategory = new Category(category);
try {
    const savedCategory = await newCategory.save();
    res.send(savedCategory);
} catch (error) {
    res.send(error.message);
}

当然,这意味着您需要先创建这种对象才能传递它,我以您的数据为例。您可以在前端或后端进行排序,只要对您更有意义。


或者,您可以创建第Category一个:

const newCategory = new Category({ categoryName: req.body.categoryName })

然后添加剩余元素(使用数组,您可以push动态使用循环到元素):

const newCategory.subcategories = [{
    "subcategoryName": "chemical enginnering",
    "books": [
        {
            "bookName": "",
            "author": "",
            "ratings": [3, 4, 5, 3],
            "feedbacks": ["awesome book", "very amazing book"],
            "price": 222
        }
    ]
},
{
    "subcategoryName": "mechanical engineering",
    "books": [
        {
            "bookName": "",
            "author": "",
            "ratings": [3, 4, 5, 3],
            "feedbacks": ["awesome book", "very amazing book"],
            "price": 222
        }
    ]
}]

等等

这实际上完全取决于您的数据的结构方式以及您如何从前端传递它,但我认为您明白了。


请注意,您的示例数据中有拼写,请将“feedbcks”更改为“feedbacks”。


推荐阅读