如何使用Node.js与Mongoose将JSON数组请求体逐条存入数据库
问题描述
我希望将JSON数组类型的请求体作为单独文档存入Mongoose数据库,以下是我的Order模型:
const mongoose=require('mongoose'); const items = require('../models/item_model'); const orderSchema=mongoose.Schema({ item_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Item', require: true }, handicraftmen_id : {type: String ,require: true}, customer_id : {type: String ,require: true}, quantity : {type : Number,default: 1}, status : {type : Number,default:1}, amount:{type:Number,require:true}, createDate :{type: String, require:true}, },{timestamps: true}); module.exports = mongoose.model('Order',orderSchema);
我的请求体如下所示:
[ { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "cutomer_id":"62fa132d8c29dac0417agf45", "qty": "4", "amount":"2000" }, { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "cutomer_id":"62fa132d8c29dac0417agf45", "qty": "1", "amount":"500" }, { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "cutomer_id":"62fa132d8c29dac0417agf45", "qty": "3", "amount":"1500" } ]
想把上述请求体中的数据逐条添加到数据库,请问如何用Node.js和Mongoose实现?
解决方案
前置修正说明
先处理请求体与模型的匹配问题:
- 请求体里的
cutomer_id是拼写错误,需改为customer_id才能匹配模型字段 - 请求体的
qty对应模型里的quantity字段 - 模型要求
createDate为必填项,请求体未提供,需要补充 qty和amount是字符串类型,需转为Number类型匹配模型定义
实现方式
方式一:批量插入(推荐,效率更高)
使用Mongoose的insertMany()方法一次性插入所有处理后的文档:
const Order = require('../models/order_model'); // 引入你的Order模型 // 假设这是从请求中获取到的JSON数组 const orderRequestData = [ { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "customer_id":"62fa132d8c29dac0417agf45", "qty": "4", "amount":"2000" }, { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "customer_id":"62fa132d8c29dac0417agf45", "qty": "1", "amount":"500" }, { "item_id": "62fa132d8c29dac0417afd36", "handicraftmen_id":"62fa132d8c29dac0417afd89", "customer_id":"62fa132d8c29dac0417agf45", "qty": "3", "amount":"1500" } ]; // 预处理数据,适配模型要求 const processedOrders = orderRequestData.map(item => ({ item_id: item.item_id, handicraftmen_id: item.handicraftmen_id, customer_id: item.customer_id, quantity: Number(item.qty), amount: Number(item.amount), createDate: new Date().toISOString() // 生成当前日期字符串,格式可按需调整 })); // 执行批量插入 async function addOrders() { try { const insertedDocs = await Order.insertMany(processedOrders); console.log(`成功插入${insertedDocs.length}条订单`); // 这里可以给客户端返回成功响应 } catch (err) { console.error('插入失败:', err); // 处理错误并返回给客户端 } } addOrders();
如果需要跳过错误继续插入其他文档,可给insertMany()添加参数:
await Order.insertMany(processedOrders, { ordered: false });
方式二:逐条插入(适合需要单独处理每条数据错误的场景)
循环遍历请求数据,逐个创建Order实例并保存:
const Order = require('../models/order_model'); const orderRequestData = [/* 你的请求体数据 */]; async function addOrdersOneByOne() { const successList = []; const errorList = []; for (const item of orderRequestData) { try { const order = new Order({ item_id: item.item_id, handicraftmen_id: item.handicraftmen_id, customer_id: item.customer_id, quantity: Number(item.qty), amount: Number(item.amount), createDate: new Date().toISOString() }); const savedOrder = await order.save(); successList.push(savedOrder); } catch (err) { errorList.push({ item, error: err.message }); console.error(`插入订单失败:${JSON.stringify(item)}`, err); } } console.log(`成功插入${successList.length}条,失败${errorList.length}条`); // 可返回成功/失败明细给客户端 } addOrdersOneByOne();
额外注意
- 确保
item_id对应的Item文档在数据库中存在,否则会因关联校验失败报错 createDate的格式可根据业务需求调整,比如new Date().toLocaleDateString('zh-CN')生成中文日期格式
内容的提问来源于stack exchange,提问作者Naveen Chalaka
相关产品推荐
相关产品推荐

