Mongoose 中 insertOne 和 create 的区别

2024-12-26
tool
20

Mongoose 中,insertOnecreate 都可以用于将文档插入到数据库中,但它们之间有一些显著的区别。


insertOne

insertOne 是由 MongoDB 驱动直接提供的一个方法,用于向集合插入单个文档。

特点

  • 直接调用 MongoDB 驱动:绕过 Mongoose 的模型层,直接与数据库交互。

  • 不执行 Mongoose 的中间件(middleware):如 prepost 钩子。

  • 不进行 Schema 验证:仅确保插入的数据符合 MongoDB 的基本存储要求,而不会严格验证数据是否符合 Mongoose Schema。

  • 适合高性能插入:尤其是在需要大量插入数据时。

使用方式

const mongoose = require('mongoose');

await mongoose.connection.collection('tasks').insertOne({
  taskId: '735602426030',
  status: 'success',
  brand: 'xiaomi'
});
console.log('Document inserted!');

create

create 是 Mongoose 模型提供的一个方法,用于基于模型的 Schema 插入文档。

特点

  • 依赖 Mongoose 模型:需要使用模型进行调用。

  • 执行 Mongoose 中间件:会触发 prepost 钩子。

  • 执行 Schema 验证:会根据 Schema 定义严格验证插入的数据,确保数据完整性。

  • 返回 Mongoose 文档对象:允许使用模型方法操作返回的数据。

使用方式

const Task = require('./models/Task');

await Task.create({
  taskId: '735602426030',
  status: 'success',
  brand: 'xiaomi',
  appName: '优道省电助手',
  sdkVersion: 'release-v2.1.2'
});
console.log('Document created!');

对比总结

特性 insertOne create
调用方式 直接调用 MongoDB 驱动 使用 Mongoose 模型
Schema 验证 不执行 执行严格验证
中间件支持 不支持 支持(prepost 钩子)
性能 更高(绕过 Mongoose) 略低(验证和中间件增加开销)
返回类型 原始插入结果 Mongoose 文档对象
适用场景 高性能、简单插入 数据需符合 Schema 且用模型操作

选择建议

  • 使用 insertOne

    • 数据已经经过外部验证,且不需要触发中间件。

    • 对性能要求较高,或需要直接操作 MongoDB 驱动。

  • 使用 create

    • 希望利用 Mongoose 的 Schema 验证和中间件特性。

    • 插入数据后,需要使用模型提供的方法继续操作文档。

根据项目需求选择合适的方法能提高代码的可靠性和性能。

原文地址:https://webfem.com/post/mongoose-create,转载请注明出处