【问题标题】:how to insert array of objects and array of nested objects into mongodb using mongoose in nodejs如何在nodejs中使用mongoose将对象数组和嵌套对象数组插入mongodb
【发布时间】:2018-06-22 17:52:54
【问题描述】:

我知道已经有类似的问题可用,但所有这些问题都只涉及嵌套对象数组,但我的查询是对象数组,并且数组中的每个对象都包含嵌套对象。所以在这种情况下,其他问题对我没有帮助。

我的查询是我想在 nodejs 中使用 mongoose 将以下数据插入 mongodb。

我的 JSON 如下所示

{"categories": [
    {
        "name": "Books & Magazines", 
        "value": 1,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    },
    {
        "name": "Books & Magazines", 
        "value": 2,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    },
    {
        "name": "Books & Magazines", 
        "value": 3,
        "subCategories":[
            {
                "name": "Book", 
                "value": 1,
            },
            {
                "name": "Book series", 
                "value": 2,
            }
        ]
    }
    ]
}

我的这个 JSON 的架构如下所示

const mongoose = require('mongoose'),
Schema = mongoose.Schema;

var CategorySchema = new Schema({
      categories:[{
        name: {
          type: String, 
          required: true, 
          trim: true
        },
        value: {
          type: Number, 
          required: true
        },
        createdAt: {
          type: Date, 
          default: Date.now
        },
        updatedAt: {
          type: Date, 
          default: Date.now
        },
        subCategories:  [{
          name: {
            type: String, 
            required: true, 
            trim: true
          },
          value: {
            type: Number, 
            required: true
          }
        }] 
    }]
})

module.exports = mongoose.model('Page_Categories', CategorySchema);

控制器部分如下

const Page_Categories = require('../models/categories');

exports.savePageCategories = function (req, res, next) {
    const data = req.body;
    // console.log("Data: ", data.categories)
    const pageCategories = new Page_Categories({ data });
console.log("pageCategories: ", pageCategories)
    pageCategories.save((err, post) => {
      if (err) { return next(err); }

      res.status(201).json({
        user: post
      });
    });
};

我能够成功保存,但它保存为空记录。请看下文

{ "_id" : ObjectId("5a5ae9e7855059417c471784"), "categories" : [ ], "__v" : 
0 }

知道为什么它会插入空记录吗?

【问题讨论】:

  • 您是否尝试为您的 SubCategories 属性指定类型?:[{type: SubCategories}]。如果需要 So,您也可以使用 required: true 进行设置。
  • 按照您的建议更新了我的架构。你能告诉我如何在控制器中将该请求 json 设置为 PageCategories 模式吗?这是我觉得困难的地方。
  • 假设您的请求数据在 req.body.data 中,尝试将您的 data 常量传递给 pageCategories 实例化:new pageCategories(data)
  • 我试过了,但验证失败。 ValidationError:Page_Categories 验证失败:值:路径 value 是必需的。名称:路径 name 是必需的
  • 对不起,我没有意识到。尝试删除 .add 部分:CategorySchema.add(... 并将您的 CategorySchema 中的 SubCategories: {type: SubCategories, required: true} 更改为:SubCategories: [{type: SubCategories, required: true}]

标签: javascript node.js mongodb mongoose


【解决方案1】:

@Marventus 的帮助解决了这个问题。

如果您查看我的 json(这是我的问题),它实际上是一个类别数组,每个类别都有自己的子类别,它也是一个数组。因此,如果您查看下面的架构,我已将名称、值、createdAt、updatedAt 声明为普通对象而不是数组。验证失败。

var CategorySchema = new Schema({
    name: {
      type: String, 
      required: true, 
      trim: true
    },
    value: {
      type: Number, 
      required: true
    },
    createdAt: {
      type: Date, 
      default: Date.now
    },
    updatedAt: {
      type: Date, 
      default: Date.now
    },
    subCategories:  [{
      name: {
        type: String, 
        required: true, 
        trim: true
      },
      value: {
        type: Number, 
        required: true
      } 
    }]
})

工作模式:我已将顶级类别更改为数组并且它有效

const mongoose = require('mongoose'),
Schema = mongoose.Schema;

var CategorySchema = new Schema({
      categories:[{
        name: {
          type: String, 
          required: true, 
          trim: true
        },
        value: {
          type: Number, 
          required: true
        },
        createdAt: {
          type: Date, 
          default: Date.now
        },
        updatedAt: {
          type: Date, 
          default: Date.now
        },
        subCategories:  [{
          name: {
            type: String, 
            required: true, 
            trim: true
          },
          value: {
            type: Number, 
            required: true
          }
        }] 
    }]
})

【讨论】:

  • 在答案中发布解决方案。
  • 更新了答案
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 2022-11-10
  • 2015-01-31
  • 2021-08-13
  • 2019-03-28
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多