MongoDB小课堂: 文档操作核心技术指南:主键机制、CRUD操作与最佳实践

MongoDB完全指南:从CRUD到分布式集群实战 MongoDB 是一个文档数据库,为简化应用程序的开发与扩展而设计。 阅读详情

背景:文档结构与主键核心机制


1 ) 文档主键(_id)的本质

技术简注:_id是MongoDB文档的全局唯一标识符,功能等同于SQL数据库的主键。

  • 强制性唯一标识

    • 每篇文档必须包含_id字段,值在集合内绝对唯一
    • 支持除数组外所有数据类型:整型、UUID、字符串或复合主键(嵌套文档)
  • ObjectId自动化生成

    字节段长度作用
    时间戳4Unix秒级时间(getTimestamp()提取)
    机器ID5生成主机的唯一标识符
    计数器3同一秒内的防重复序列
    // 生成与解析ObjectId 
    const newId = new ObjectId(); 
    console.log(newId.getTimestamp()); // 输出:ISODate("2023-10-05T08:30:00Z")
    
  • 时钟偏差风险
    分布式系统中客户端时钟不同步时,生成顺序可能与创建时间顺序不一致。

方法:文档创建操作核心技术


1 ) 单文档插入(insertOne)

db.accounts.insertOne(
  { 
    _id: "account1",  // 显式主键(可选)
    name: "Alice",
    balance: 1000 
  },
  { writeConcern: { w: "majority" } } // 安全写级别配置 
)

特性:

  • 自动建集合(目标集合不存在时)
  • 主键冲突报错:E11000 duplicate key error
  • 返回结构:{ acknowledged: true, insertedId: "account1" }

2 ) 批量插入(insertMany)

// 无序写入(ordered:false优化吞吐量)
db.accounts.insertMany(
  [
    { _id: "dupKey", name: "ErrorDoc" }, 
    { name: "ValidDoc" } // 此文档成功写入
  ],
  { ordered: false } 
)
操作模式错误处理机制适用场景
ordered:true(默认)遇错立即停止事务性连续写入
ordered:false继续执行非冲突文档大数据批量导入

3 ) 通用插入命令(insert)

// 单文档与批量统一接口
db.accounts.insert({ name: "SingleDoc" })  // 单文档 
db.accounts.insert([ { _id: "doc1" }, { _id: "doc2" } ]) // 多文档

与insertMany差异:

  • 支持explain()执行计划分析
  • 返回格式:WriteResult({ "nInserted": N })
  1. save命令的智能逻辑
// 根据_id存在性自动选择操作
db.accounts.save({ name: "New" })  // 无_id → insert操作
db.accounts.save({ _id: "exist", name: "Update" })  // 有_id → update操作

命令对比与特性总结

命令适用场景返回结果格式是否支持explain
insertOne单文档插入{acknowledged, insertedId}❌
insertMany多文档插入{acknowledged, insertedIds}❌
insert单/多文档插入WriteResult / BulkWriteResult✅

要点

  1. insertOne适合单文档事务写入
  2. insertMany + ordered:false提升批量吞吐量
  3. insert支持执行计划分析
  4. save根据_id自动路由操作类型

ObjectId 的显式操作

// 生成新ObjectId
const newId = ObjectId()  // 输出:ObjectId("507f1f77bcf86cd799439011")
 
// 解析时间戳 
const creationTime = newId.getTimestamp()  // 返回ISO日期字符串
 
// 从字符串构造ObjectId
const customId = ObjectId("507f1f77bcf86cd799439011")

案例:复合主键实战与陷阱


1 ) 复合主键定义

db.accounts.insert({
  _id: { 
    type: "savings",  // 字段顺序敏感!
    number: "001" 
  },
  name: "ComplexKey"
})

2 ) 主键顺序陷阱

// 字段顺序变化生成新主键!
db.accounts.insert({
  _id: { 
    number: "001",   // 顺序颠倒 
    type: "savings"  
  }, 
  name: "OrderMatters" 
}) // 成功写入(非冲突)

核心规则:

字段顺序变化
复合主键
字段序列化
生成哈希值
唯一性校验
新哈希值 = 新主键

要点

  • 复合主键的唯一性由字段键值对的有序结构决定
  • 字段顺序变化将被视为不同主键
  • 生产环境建议固定字段顺序(如Schema强制约束)

方法:文档读取核心技术栈


1 ) find查询引擎与游标

// 链式操作:查询→排序→分页
const cursor = db.accounts.find({ balance: { $gt: 500 } }) 
cursor.sort({ name: 1 })
      .skip(10)
      .limit(5)
      .forEach(printjson);

2 ) 投射(Projection)性能优化

技术简注:投射通过字段筛选减少网络传输。

// 只返回name和balance(排除_id)
db.accounts.find(
  { type: "checking" }, 
  { name: 1, balance: 1, _id: 0 }  // 1=包含, 0=排除 
)

性能影响:

  • 减少70%+网络传输开销
  • 嵌套文档支持:{ "contact.phone": 1 }

3 ) 查询操作符体系

类型操作符示例作用
比较操作符$eq, $gt, $in值比较
逻辑操作符$and, $or, $not条件组合
数组操作符$elemMatch, $size数组字段查询
元素操作符$exists, $type字段存在性/类型检查

案例:NestJS集成MongoDB实战


1 ) 数据模型定义

// account.schema.ts 
@Schema()
export class Account extends Document {
  @Prop({ type: Object, required: true })
  _id: { type: string; number: string };  // 复合主键
 
  @Prop({ required: true })
  name: string;
 
  @Prop({ default: 0 })
  balance: number;
}

2 ) 服务层CRUD实现

@Injectable()
export class AccountsService {
  constructor(
    @InjectModel(Account.name) private accountModel: Model<Account>
  ) {}
 
  // 批量插入(无序)
  async bulkCreate(accounts: AccountDto[]) {
    return this.accountModel.insertMany(accounts, { ordered: false });
  }
 
  // 复合主键查询
  async findByCompositeKey(type: string, number: string) {
    return this.accountModel.findOne({ 
      _id: { type, number }  // 字段顺序必须一致!
    });
  }
}

最佳实践与错误处理


1 ) 错误处理标准化

操作成功响应格式主键冲突错误
insertOne{acknowledged:true, insertedId}WriteError对象
insertMany{acknowledged:true, insertedIds}BulkWriteError含错误统计
// NestJS错误处理范例 
try {
  await collection.insertMany(data, { ordered: false });
} catch (error) {
  if (error.code === 11000) {  // 主键冲突代码 
    const dupKeys = error.keyValue; 
    throw new ConflictException(`重复主键: ${dupKeys}`);
  }
}

2 )核心性能优化策略

  • 主键设计:
    • 优先使用ObjectId规避唯一性管理负担
    • 复合主键需严格字段顺序管理
  • 写入优化:
    /* 性能诊断语句 */
    db.runCommand({ 
      explain: { insert: "accounts", documents: [...] }, 
      verbosity: "executionStats" 
    })
    
    • 金融系统启用安全写:{ w: "majority", j: true }(日志持久化)
    • 控制写入操作的确认机制,通过w参数指定:
      • w: 1(默认):主节点确认即返回
      • w: "majority":多数节点确认
      • j: true:写入日志后返回
  • 查询优化:
    • 投射过滤减少70%+网络传输
    • 使用snapshot()防止重复读取,batchSize()控制网络传输量
       db.accounts.find().snapshot().batchSize(50)
      
    • 游标分批加载:cursor.batchSize(50)

全局最佳实践总结

  1. 大规模写入使用insertMany+ordered:false
  2. 复合主键字段顺序需通过Schema强制约束
  3. 查询必用投射减少传输开销
  4. 金融系统启用writeConcern: majority
  5. 错误处理优先识别code:11000主键冲突
文档操作
创建
读取
insertOne
insertMany
复合主键
find+投射
游标控制
安全写级别
有序/无序
字段顺序敏感
异步之舞:Motor驱动与MongoDB的CRUD交响曲 title: 异步之舞:Motor驱动与MongoDB的CRUD交响曲author:excerpt:Motor 异步驱动是专为 Python 异步框架设计的 MongoDB 连接器,基于 asyncio 实现非阻塞 I/O 操作,提升 FastAPI 的并发处理能力。通过 CRUD 操作示例,展示了如何使用insert_onefindupdate_one和delete方法进行文档的创建、查询、更新和删除。 阅读详情

相关推荐

el-upload自定义上传dwg/dxf文件并且携带额外参数(CAD)

需求:需要使用el-upload自定义上传cad的图片或普通图片,这边需要判断区分下,以及上传后清空上传文件列表。

请叫我欧皇!的博客 1535

mongodb创建时间时差

go相关学习资料:https://edu.51cto.com/video/4196.htmlMongoDB创建时间时差 MongoDB是一种流行的NoSQL数据库,它以灵活的文档结构和高性能著称。在MongoDB中,文档的创建时间是一个重要的属性,但有时我们可能会遇到创建时间时差的问题。本文将通过代码示例和序列图,详细解...

weixin_41000572的博客 161

【LPDDR4 - 学习二】LPDDR4 介绍 ——LPDDR4 芯片引脚说明解析

本文系统解析了LPDDR4内存芯片的引脚定义与特性,重点介绍了272球POPFBGA封装的双通道架构。内容涵盖电源管理(三级供电架构与上电时序)、控制信号(差分时钟与复用命令总线)、数据接口(16位双向数据总线与选通信号)以及校准复位等核心模块。通过表格详细列明了各引脚电压范围、功能定义及工程注意事项,并附有典型封装球位分布图。全文基于JEDEC标准,为移动设备内存设计提供全面的硬件参考,特别强调电源时序控制、信号完整性及抗干扰设计等关键点。

zap15622077817的博客 2650

MongoDB【应用 01】通过_id获取记录创建时间(生成规则+解析步骤+源码分享(1)

【代码】MongoDB【应用 01】通过_id获取记录创建时间(生成规则+解析步骤+源码分享(1)

2401_84281629的博客 365

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5994

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1054

MongoDB数据插入、删除、更新

1. MongoDB数据插入 MongoDB插入文档 // 插入语法 db.[collectionName].insert({}) // example db.sample.insert({name:"mongo"})sample结果: 2. 批量插入文档 shell 这样执行是错误的 db.[collectionName].insert([{},{},{},……..])

世界那么大,我想去看看! 1万+

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

qq_43212290的博客 800

python MongoDB 自动生成创建时间与更新时间(create_time/update_time)

一.实例 # 类似 MySQL 以下语句,并更新时间 INSERT INTO ... ON DUPLICATE KEY UPDATE ... # 第一次执行时,生成 create_time 和 update_time # 第二次执行时,更新 update_time 二.Mongo Shell 方式一. db.student.updateOne( { sno: 1 }, { $setOnInsert: { create_time: new Date() },

Cocktail_py的博客 4689

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1226

SQL注入详解

SQL注入(SQL Injection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。 即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询...

渗透之路,攻防之间皆学问 26万+

MongoDB 批量添加记录中不存在的字段

MongoDB是基于分布式文件存储的数据库,与关系型数据库不同,记录中的字段数量可以各不相同。本文将介绍如何对MongoDB记录中不存在的字段进行批量添加并赋值。

傲雪星枫 2万+

MAX30102心率血氧传感器原理图设计,已量产(e-Health传感器)

在最近的便携健康监测设备项目中,我们采用了集成算法的 MAX30102 心率血氧模块 —— 这类带内置 MCU 算法的传感器能直接输出心率 / 血氧数值,大幅降低了主控资源占用。但硬件电路的稳定性直接决定了 PPG 信号的采集精度,下面结合实际项目里的原理图,拆解下这个模块的设计细节。

不脱发的程序猿 1283

MongoDB CRUD操作完全指南:从入门到精通

在当今数据驱动的时代,数据库管理系统扮演着至关重要的角色。作为最受欢迎的NoSQL数据库之一,MongoDB以其灵活的数据模型、卓越的可扩展性和强大的查询能力赢得了开发者的青睐。本文将全面介绍MongoDB的核心操作——CRUD(创建、读取、更新、删除),帮助您掌握这一强大工具的基础与进阶用法。

vvilkin的学习备忘 1432

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MongoDB学习01:MongoDB的安装及其CRUD操作

文章目录MongoDB的安装与使用下载安装MongoDB并将其目录加入到Path启动MongoDB将MongoDB加入系统服务MongoDB基本CRUD操作 MongoDB的安装与使用 下载安装MongoDB并将其目录加入到Path MongoDB社区版的下载地址:MongoDB社区版下载 启动MongoDB 将MongoDB加入系统服务 MongoDB基本CRUD操作 ...

ncepu_Chen的博客 4795

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【MongoDB篇】MongoDB的文档操作!

MongoDB的文档操作,简单易懂!🎉

qq_56158663的博客 2078

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MongoDB CRUD操作:更新文档

摘要:可以使用下面的方式更新MongoDB集合的文档: * 使用编程语言提供的驱动程序,在应用中调用API进行更新。 * 使用MongoDB Atlas UI更新文档。 * 使用MongoDB Compass、mongosh。 * 使用其他第三方工具。

superatom01的博客 1635

Mongodb的CRUD操作

Hello,大家好之前文章发的是Mongodb部署相关的,今天来说说Mongodb的CRUD操作首先,大家在学习Mongodb的时候建议先去看官方文档学习,Mongodb有中文文档,中文社区文档跟官方的英文文档。

JJW1002的博客 1601

MongoDB文档CRUD操作详解

在当今大数据时代,数据库技术作为信息存储和检索的核心,其重要性不言而喻。MongoDB作为一种流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性,在处理大规模数据集时表现出色。然而,在实际应用中,如何高效地操作MongoDB中的文档,成为了一个关键问题。本文将围绕MongoDB知识点之文档CRUD操作进行概述,旨在帮助读者了解这一操作的重要性及其在实践中的应用。在许多业务场景中,数据是企业的核心资产。以电商网站为例,用户信息、商品信息、订单信息等数据都需要存储在数据库中。

我是Java程序员廖志伟,感谢朋友们的支持! 786

用Java操作Mongodb实现CRUD

        本篇博客,为大家带来在IDEA上通过Java代码实现Mongodb的CRUD操作! 文章目录一.连接数据库二.插入文档<1>插入一个文档<2>插入多个文档三.删除文档<1>删除与筛选器匹配的单个文档<2>删除与筛选器匹配的所有文档四.修改文档<1&...

大数据梦想家 9068

MongoDB 原生组件 CRUD 数据库、集合、文档、批量操作

目录 环境准备 mongo-java-driver 获取 新建项目 开启 MongoDB 服务端 CRUD 数据库操作 集合操作 文档文件内容 MongoDBTest MongoCollectionTest 本文导读 相比 Java 操作 关系型数据库(如 Mysql) 而言,Java 操作 noSql 更加简单,因为没有事务这些操作 Java 操作 Mysql 数据库...

蚩尤后裔-汪茂雄 7737

掌握MongoDB:文档与集合操作指南

本文深入探讨了MongoDB的数据模型和集合操作,包括文档的CRUD操作、查询优化、聚合操作、文本搜索和地理空间查询等高级特性。同时,文章还介绍了MongoDB的安全性和权限管理功能。通过生活实例和实际案例,读者可以更好地理解和应用MongoDB的数据管理和数据处理技巧。掌握MongoDB的数据模型和集合操作对于开发高效、可扩展的应用程序至关重要。

silenceallat的博客 1398

MongoDB CRUD操作:插入文档

摘要:MongoDB的插入操作有多种途径,本文对使用Atlas UI,Compass、mongosh的操作进行了详细的说明。

superatom01的博客 1129
上一篇: MongoDB小课堂: 容器化部署与操作综合指南
下一篇: MongoDB小课堂: 文档查询之匹配查询与比较操作符深度解析
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值