You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:27:35