将对象数组保存到 db Nodejs 和 MongoDB
Saving an array of objects to db Nodejs and MongoDB
我对 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 }
})
并有一个post路由器以将新数据保存到数据库(如下图)
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 个对象,这是我在 post router 中将数组设置为“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 循环 或什么来 store inc & exp[= 的数组51=] 数据优先。但是我就是不知道怎么办。
我一直在搜索google。但是还没有运气。无论如何,任何帮助将不胜感激。谢谢。
顺便说一句,它给了我这个错误(如下所示)-
"_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 循环并准备要保存在 中的 expArr 数组]exp:
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
})
}
})
我对 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 }
})
并有一个post路由器以将新数据保存到数据库(如下图)
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 个对象,这是我在 post router 中将数组设置为“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 循环 或什么来 store inc & exp[= 的数组51=] 数据优先。但是我就是不知道怎么办。
我一直在搜索google。但是还没有运气。无论如何,任何帮助将不胜感激。谢谢。
顺便说一句,它给了我这个错误(如下所示)-
"_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 循环并准备要保存在 中的 expArr 数组]exp:
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
})
}
})