我对 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/