如何在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
相关产品推荐
相关产品推荐

