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

如何在Mongoose中实现多文档插入数量统计及ID打印的控制台输出

用Mongoose实现多文档插入并输出插入统计及文档ID

原生驱动实现效果

我之前使用MongoDB原生驱动向本地MongoDB插入多文档时,代码及输出如下:

原生驱动代码

const { MongoClient } = require("mongodb");
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);

async function run() {
  const dbName = client.db("fruitsDB");

  try {
    await client.connect();
    
    // 插入文档的函数调用
    await insertMultiDocs(dbName, docs);
  
    // 建立并验证连接
    await client.db("admin").command({ ping: 1 });
    console.log("Connected successfully to server");
  } finally {
    await client.close();
 }
}
run().catch(console.dir);

// 待插入的文档列表及插入函数
const docs = [
    { name: "Ananas", rating: 7, review: "nice fruit"},
    { name: "Prune", rating: 8, review: "Kinda good"},
    { name: "Peach", rating: 7, review: "taste great"},
    { name: "Strawberry", rating: 9, review: "great fruit"}
];

async function insertMultiDocs (client, newList) {
  try {
    const insertManyresult = await client.collection("fruits").insertMany(newList);
    let ids = insertManyresult.insertedIds;
    console.log(`${insertManyresult.insertedCount} documents were inserted.`);
    for (let id of Object.values(ids)) {
    console.log(`Inserted a document with id ${id}`);
    }
  } catch(e) {
    console.log(`A MongoBulkWriteException occurred, but there are successfully processed documents.`); 
    let ids = e.result.result.insertedIds;
    for (let id of Object.values(ids)) {
     console.log(`Processed a document with id ${id._id}`);
    }
   console.log(`Number of documents inserted: ${e.result.result.nInserted}`);
  }
}

控制台输出

4 documents were inserted.
Inserted a document with id 63051aeb6b883a87e46ea895
Inserted a document with id 63051aeb6b883a87e46ea896
Inserted a document with id 63051aeb6b883a87e46ea897
Inserted a document with id 63051aeb6b883a87e46ea898
Connected successfully to server

当前Mongoose代码

现在改用Mongoose实现多文档插入,插入已成功,但无法输出上述统计信息,代码如下:

const mongoose = require("mongoose");
const { Schema } = mongoose;

main().catch(err => console.log(err));

async function main() {

  try {
    await mongoose.connect("mongodb://localhost:27017/fruitsDB");
    
    const fruitSchema = new Schema({
      name : String,
      rating : Number,
      review : String
    });

    const Fruit = mongoose.model("Fruit", fruitSchema);
    
    // 插入文档
    Fruit.insertMany(docs)
    
  } catch (error) {
    console.log(error);
  }
}

// 待插入的文档列表
const docs = [
    { name: "Ananas", rating: 7, review: "nice fruit"},
    { name: "Prune", rating: 8, review: "Kinda good"},
    { name: "Peach", rating: 7, review: "taste great"},
    { name: "Strawberry", rating: 9, review: "great fruit"}
];

修改后的Mongoose代码(实现相同输出)

要实现和原生驱动一致的控制台输出,需处理insertMany的返回值,并补充异常处理、连接提示及关闭逻辑,代码如下:

const mongoose = require("mongoose");
const { Schema } = mongoose;

main().catch(err => console.log(err));

async function main() {
  try {
    // 连接数据库并验证
    await mongoose.connect("mongodb://localhost:27017/fruitsDB");
    console.log("Connected successfully to server");
    
    const fruitSchema = new Schema({
      name : String,
      rating : Number,
      review : String
    });

    const Fruit = mongoose.model("Fruit", fruitSchema);
    
    // 插入文档并获取返回结果
    const insertedDocs = await Fruit.insertMany(docs);
    
    // 输出插入统计和每个文档ID
    console.log(`${insertedDocs.length} documents were inserted.`);
    insertedDocs.forEach(doc => {
      console.log(`Inserted a document with id ${doc._id}`);
    });

  } catch (error) {
    // 处理部分插入成功的异常情况
    if (error.name === 'BulkWriteError') {
      console.log(`A MongoBulkWriteException occurred, but there are successfully processed documents.`);
      const insertedIds = error.result.insertedDocs.map(doc => doc._id);
      insertedIds.forEach(id => {
        console.log(`Processed a document with id ${id}`);
      });
      console.log(`Number of documents inserted: ${error.result.nInserted}`);
    } else {
      console.log(error);
    }
  } finally {
    // 关闭数据库连接
    await mongoose.connection.close();
  }
}

// 待插入的文档列表
const docs = [
    { name: "Ananas", rating: 7, review: "nice fruit"},
    { name: "Prune", rating: 8, review: "Kinda good"},
    { name: "Peach", rating: 7, review: "taste great"},
    { name: "Strawberry", rating: 9, review: "great fruit"}
];

关键说明

  • Mongoose的insertMany会返回插入成功的文档数组,通过insertedDocs.length可获取插入数量,遍历数组即可拿到每个文档的_id。
  • 针对部分插入成功的异常(对应原生的MongoBulkWriteException),Mongoose会抛出BulkWriteError,可从error.result中提取成功插入的文档信息和数量。
  • 补充了连接成功提示,以及在finally中关闭数据库连接,和原生驱动的逻辑保持一致。

内容的提问来源于stack exchange,提问作者ShueiYang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:06:30