热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MongoDB学习笔记一ID自增长

概要MongoDB的_id字段作为一个主键存在于所有文档的最顶层,_id必须是唯一的,而且总是具有唯一约束的索引。除了唯一约束,你可以在集合中的_id字段上使用任何值,以下这个指南描述了在_id上创建一个自增序列的两种方式:UseCounterCollectionOptimis

概要 MongoDB 的_id字段作为一个主键存在于所有文档的最顶层,_id必须是唯一的,而且总是具有唯一约束的索引。除了唯一约束,你可以在集合中的_id字段上使用任何值, 以下这个指南描述了在_id上创建一个自增序列的两种方式: Use Counter Collection Optimis

概要

MongoDB 的_id字段作为一个主键存在于所有文档的最顶层,_id必须是唯一的,而且总是具有唯一约束的索引。除了唯一约束,你可以在集合中的_id字段上使用任何值,

以下这个指南描述了在_id上创建一个自增序列的两种方式:

Use Counter Collection

Optimistic Loop

注意事项

一般情况下,你不会愿意在_id字段,或任何字段上使用自增模式,那是因为不会有大量的文档构成的大规模数据库,通常情况下,更为理想的是默认_id。

实现过程

Use Counter Collection

Counter集合实现:

利用一个单独的计数器集合去跟踪我们使用的最后一个数字序列。该_id字段包含了序列名称和序列字段中该序列最后的值。

1、插入计数器集合,设置初始值为userid:

db.counters.insert(
   {
      _id: "userid",
      seq: 0
   }
)
2、创建一个getNextSequence函数,参数为序列的name,函数使用findandmodify()方法去自动增长序列的值并返回增长之后的结果:
function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true
          }
   );

   return ret.seq;
}
3、在接下来插入数据的时候,使用getNextSequence这个函数:
db.users.insert(
   {
     _id: getNextSequence("userid"),//注意getNextSequence参数要与计数器集合中_id值一致
     name: "Sarah C."
   }
)
db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "Bob D."
   }
)
4、你可以试着查看结果:
db.users.find()
5、_id字段包含了自动增长序列的值:
{
  _id : 1,
  name : "Sarah C."
}
{
  _id : 2,
  name : "Bob D."
}
findandmodify这个方法包含了更新,查询字段并不是一定要有唯一索引,该方法可以在某些情况下多次插入同一个文档。例如,有多个客户端在使用同样查询条件时,

都调用该方法,那么调用这些方法在执行更新操作之前必须先完成查询操作,而且这些方法能插入相同的文档。

在计数器事例中,查询字段是_id字段,它总是有一个独立的索引。我们再看如下示例:

function getNextSequence(name) {
   var ret = db.counters.findAndModify(
          {
            query: { _id: name },
            update: { $inc: { seq: 1 } },
            new: true,
            upsert: true
          }
   );
   return ret.seq;
}
如果多个客户端在传入相同参数情况下来调用getNextSequence()方法,然后我们会发现以下其中一个行为将会发生:

一次findandmodify()方法将会成功插入一条文档;

0个或多个findandmodify()方法将会更新新插入的文件;

当它们试图插入重复的数据时,0个或多个findandmodify()方法;

如果由于违反了唯一约束而导致方法失败,请重试。

Optimistic Loop

略。


推荐阅读
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • MongoDB集群配置:副本集与分片详解
    本文详细介绍了如何在MongoDB中配置副本集(Replica Sets)和分片(Sharding),并提供了具体的步骤和命令,帮助读者理解并实现高可用性和水平扩展的MongoDB集群。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • Mongoose 5.12.10 发布:MongoDB 异步对象模型工具的新特性与修复
    Mongoose 是一款专为异步环境设计的 MongoDB 对象模型工具,支持 Promise 和回调函数。最新版本 Mongoose 5.12.10 带来了多项修复和改进,包括查询选项中的默认值设置、嵌入式判别器填充、以及 TypeScript 定义文件的优化。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 本文介绍了如何利用MongoDB的$exists操作符在Java应用程序中检查特定字段是否存在于文档中,包括示例代码和解释。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • 58同城的Elasticsearch应用与平台构建实践
    本文由58同城高级架构师于伯伟分享,由陈树昌编辑整理,内容源自DataFunTalk。文章探讨了Elasticsearch作为分布式搜索和分析引擎的应用,特别是在58同城的实施案例,包括集群优化、典型应用实例及自动化平台建设等方面。 ... [详细]
  • 本文详细介绍了如何在MongoDB中创建全文索引及其使用方法。全文索引允许用户通过部分匹配的方式快速搜索文档中的文本内容,但需注意的是,每个集合仅能创建一个全文索引。 ... [详细]
  • 多键索引(MultiKey Indexes)是在包含数组类型字段上创建的特殊索引,旨在优化对数组元素的查询性能。本文将通过实例介绍如何在MongoDB中创建和使用多键索引。 ... [详细]
  • ODBC介绍:开放式数据库连接详解
    本文详细介绍了ODBC(开放式数据库连接),这是一种允许应用程序访问多种数据库系统的标准API。自1992年由微软与Simba合作推出以来,ODBC已成为跨平台数据访问的重要标准。 ... [详细]
  • 利用GitHub热门资源,成功斩获阿里、京东、腾讯三巨头Offer
    Spring框架作为Java生态系统中的重要组成部分,因其强大的功能和灵活的扩展性,被广泛应用于各种规模的企业级应用开发中。本文将通过一份在GitHub上获得极高评价的Spring全家桶文档,探讨如何掌握Spring框架及其相关技术,助力职业发展。 ... [详细]
author-avatar
小HuLkfz_264
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有