node.js - 将对象数组保存到数据库 Nodejs 和 MongoDB

标签 node.js mongodb mongoose save arrayobject

我对 Nodejs 和 MongoDB 还很陌生。

所以我在 Nodejs 中构建了一个如下所示的架构(如下所示) - 数据架构

// create Data Schema
const dataSchema = new mongoose.Schema({
    allItems: {
        // store all expenses here
        exp: [{
            description: { type: String, require: true, min: 2, max: 50 },
            value: { type: Number, require: true },
            percentage: { type: Number, require: true }
        }],
        // store all incomes here
        inc: [{
            description: { type: String, require: true, min: 2, max: 50 },
            value: { type: Number, require: true }
        }]
    },
    // store total incomes & expenses
    totals: {
        // sum of total expenses, init = 0
        exp: { type: Number, require: true, default: 0},
        // sum of total incomes, init = 0
        inc: { type: Number, require: true, default: 0}
    },
    // store total budgets, init = 0
    budget: { type: Number, require: true, default: 0 },
    // store percentage of total budget
    // init -1 = something is not in existance yet
    percentage: { type: Number, require: true, default: -1 } 
})

并且有一个后路由器保存新数据到数据库(如下所示)

router.post('/', async (req, res) => {

    // hold exp & inc array length
    expLength = req.body.allItems.exp.length
    incLength = req.body.allItems.inc.length

    // do something to hold allItems exp & inc data first
    // do some code here?

    // create new data
    const data = new Data({
        allItems: {
            exp: [
                {
                    description: req.body.allItems.exp,
                    value: req.body.allItems.exp,
                    percentage: req.body.allItems.exp
                }
            ],
            inc: [
                {
                    description: req.body.allItems.inc,
                    value: req.body.allItems.inc
                }
            ]
        },
        totals: {
            exp: req.body.totals.exp,
            inc: req.body.totals.inc
        },
        budget: req.body.budget,
        percentage: req.body.percentage
    })

    try {
        const saveData = await data.save()
        res.json(saveData)
    } catch(err) {
        res.json({
            message: err
        })
    }
})

所以我使用Postman来帮助我了解nodejs和mongodb。

在 postman 中,我已准备好执行这些数据(如下所示)。其中,我在 allItems 下的数组 exp 中有 2 个对象。

{
    "allItems": {
        "exp": [
            // first object
            {
                "description": "Rent",
                "value": 500,
                "percentage": 50
            },
            // second object
            {
                "description": "Loan",
                "value": 250,
                "percentage": 25
            }
        ],
        "inc": [
            {
                "description": "Web",
                "value": 1000
            }
        ]
    },
    "totals": {
        "exp": 750,
        "inc": 1000
    },
    "budget": 250,
    "percentage": 75
}

但不幸的是它只能保存1个对象,这是我在后置路由器中将数组设置为“0”后的第一个对象(如下所示)。

{
    "totals": {
        "exp": 750,
        "inc": 1000
    },
    "budget": 250,
    "percentage": 75,
    "_id": "5e6139b3111a7b593ce296cd",
    "allItems": {
        "exp": [
            // only save the first object
            {
                "_id": "5e6139b3111a7b593ce296ce",
                "description": "Rent",
                "value": 500,
                "percentage": 50
            }
        ],
        "inc": [
            {
                "_id": "5e6139b3111a7b593ce296cf",
                "description": "Web",
                "value": 1000
            }
        ]
    },
    "__v": 0
}

我认为我应该首先执行for循环或其他操作来存储inc & exp数据数组。但我就是不知道怎么办。

我一直在通过谷歌搜索它。但还没有运气。无论如何,任何帮助将不胜感激。谢谢。

顺便说一句,它给了我这个错误(如下所示) -

"_message": "Data validation failed",
"message": "Data validation failed: allItems.exp.0.description: Cast to String failed for value \"[\n  { description: 'Rent', value: 500, percentage: 50 },\n  { description: 'Loan', value: 250, percentage: 25 }\n]\" at path \"description\", allItems.exp.0.value: Cast to Number failed for value \"[\n  { description: 'Rent', value: 500, percentage: 50 },\n  { description: 'Loan', value: 250, percentage: 25 }\n]\" at path \"value\", allItems.exp.0.percentage: Cast to Number failed for value \"[\n  { description: 'Rent', value: 500, percentage: 50 },\n  { description: 'Loan', value: 250, percentage: 25 }\n]\" at path \"percentage\", allItems.inc.0.description: Cast to String failed for value \"[ { description: 'Web', value: 1000 } ]\" at path \"description\", allItems.inc.0.value: Cast to Number failed for value \"[ { description: 'Web', value: 1000 } ]\" at path \"value\"",
"name": "ValidationError"

最佳答案

您可以在 req.body.allItems.exp 上放置一个 forEach 循环,并准备要保存在 exp 中的 expArr 数组:

var expArr = [];
req.body.allItems.exp.forEach(function(eachObj){
   var obj = {
      "description": eachObj.description,
      "value": eachObj.value,
      "percentage": eachObj.percentage
   }
   expArr.push(obj);
});

虽然,通过查看您的代码,似乎不需要任何循环,您可以直接保存exp数据,如下所示:

router.post('/', async (req, res) => {

// hold exp & inc array length
expLength = req.body.allItems.exp.length
incLength = req.body.allItems.inc.length

// do something to hold allItems exp & inc data first
// do some code here?

// create new data
const data = new Data({
    allItems: {
        exp: req.body.allItems.exp,
        inc: req.body.allItems.inc
    },
    totals: {
        exp: req.body.totals.exp,
        inc: req.body.totals.inc
    },
    budget: req.body.budget,
    percentage: req.body.percentage
})

try {
    const saveData = await data.save()
    res.json(saveData)
} catch(err) {
    res.json({
        message: err
    })
 }
})

关于node.js - 将对象数组保存到数据库 Nodejs 和 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551552/

相关文章:

node.js - 发送node.js响应并在客户端进行处理

javascript - Node.js 使用 TypeScript 导出语法

mongodb - 如何知道整个集合是否在mongodb river中被索引

javascript - Mongoose - 如何使用多个更新语句进行单个更新

ios - 无法在 iOS Facebook SDK 中将 access_token 验证到 PassportJS

javascript - 寻找创建多人游戏的 Node.js 简单教程 (socket.io)

javascript - 免费的 Heroku 站点无法提供安全连接 : ERR_SSL_PROTOCOL_ERROR

javascript - 我是否需要使用来自 node.js 的 mongodb 进行同步调用/事务?

node.js - 通过 mongoose 将项目推送到 mongo 数组中

javascript - Mongoose 模型对象行为异常