MongoDB 实战中,记录被掉在坑中的窘境

极客喵 (GeekCat)
• 阅读 6040

公司采用 MongoDB 作为新项目的数据存储方式,以前没那么大规模用过,心里还是有点悬,不知道会掉在哪些坑里,先给自己挖个坑。

mongoDB 的第一个大坑:好大的坑,让我忙了一个下午。。。mongodb对自己开发的nodejs驱动太不负责任了吧。。。

问题描述:采用异步方式插入三条数据(三条数据的插入间隔时间不超过1s),当第一条数据写入但还没有执行回调的时候就开始插入下一条数据就会出现索引异常,提示大意就是插入了两条相同键值的记录。

为什么呢:之前在用 php 写入数据的时候不会发生这个问题,大概是因为 php 是顺序执行的,没有异步的特征。看了官方的文档,mongodb 的 _id 生成机制是基于时间戳,当前进程ID以及当前计数器的值,由于时间很短,当前时间戳是一样的,当前的进程也是一样的,问题发生的关键就是 mongodb nodejs 驱动在还没有执行回调的时候计数器的值不会增加(天啊,mongo是怎么想的啊,mysql 很早就避免了这个问题,执行一次id就会递增一次,而且不管这条信息是否执行成功,保证了是原子性的递增方式,这样才比较有业界良心啊),这样就造成了nodejs几乎同时写入mongodb时会发生索引错误,就是11000错误代码

方案:采用自己生成的 _id 来代替 mongo 生成的 _id 值,这样就能够有效进行避免。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MONGODB 如何保证数据写入安全特性 ,开发人员自己做主
!(https://oscimg.oschina.net/oscnet/79b604f1201e4e4490df991ea5f1aea1.png)这一周有事情,结尾用MONGODB作为结尾,而本周开篇,还是以MONGODB作为开始.  MONGODB的写操作中包含一个特殊的功能,就是写安全, 其他数据库在写入数据后,如果你想确
Stella981 Stella981
3年前
MongoDB分片(Sharding)技术
分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事。和MySQL分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。2.1MongoDB
Wesley13 Wesley13
3年前
MongoDB的数据类型
一.MongoDB之丰富多彩的数据类型世界首先我们要先了解一下MongoDB中有什么样的数据类型:Object ID:Documents自生成的\_idString:字符串,必须是utf8Boolean:布尔值,true或者false(这里有坑哦~在我们大Python中TrueFalse首字母大写)Integer
Stella981 Stella981
3年前
MongoDB,SpringBoot,SpringDataMongoDB
MongoDB,SpringBoot,SpringDataMongoDB双刃剑MongoDB的学习和避坑MongoDB是一把双刃剑,它对数据结构的要求并不高。数据通过keyvalue的形式存储,而value的值可以是字符串,也可以是文档。所以我们在使用的过程中非常方便。正是这种方便给我们埋下了一颗颗地雷。当内嵌的
Wesley13 Wesley13
3年前
MongoDB学习(1)
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。数据库一个mongodb中可以建立多个数据库,MongoDB中默认数据库为"db",该数据库存储在data目录中。在MongoDB中可以创建数据库,如果你想使用MongoDB,创建数据库不是必要的。"showd
Stella981 Stella981
3年前
Spring Boot 与 Kotlin 使用MongoDB数据库
我们在产品中用到NoSQL数据库MongoDB。下面就来简单介绍一下MongoDB,并且通过一个例子来介绍SpringBoot中对MongoDB访问的配置和使用。MongoDB简介MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(
Stella981 Stella981
3年前
PCB MongoDb安装与Windows服务安装
工程MI流程指示做成Web网页形式,采用MVC框架制作,数据传输用WebAPI方式,最终此网页会挂到公司各系统中访问,为了提高访问并发量,并将工程数据统一结构化管理,采用NoSQLMongoDB做为数据存储,定时将SQLSERVER数据库中已上网的数据向MongoDB转移。这里亲自体验安装MongoDb安装到使用过程,注意事项例举如下:
Stella981 Stella981
3年前
Node.js 使用 MongoDB 的 ObjectId 作为查询条件
当往MongoDB中插入一条数据时,会自动生成ObjectId作为数据的主键。那么如何通过ObjectId来做数据的唯一查询呢?在MongoDB中插入一条数据在MongoDB中插入一条如下结构的数据:{_id:5d6a32389c825e24106624e4,title:'
Stella981 Stella981
3年前
How to convert BigDecimal to Double in spring
问题描述:我们都知道对于涉及钱的数据必须使用BigDecimal类型进行存储,今天在查询mongo时仍然有精度问题,虽然我在代码中使用了BigDecimal类型,但mongo中使用的是double类型。我初步推断是mongoTemplate在类型转换时出现了问题,根源还是因为mongodb中使用了double类型来存储。但是我决定不了mongodb于是我只
Easter79 Easter79
3年前
Titan Framework MongoDB深入理解1
在TitanFrameWork框架中,已经集成了MongoDB的各个功能,现在我们对框架内部的一些重要类进行分析与解读。1.MongoDBConverter在Titan框架中,比较重要的一个接口就是MongoDBConverter,它是作为框架对MongoDB数据Bson的一个转换器,其实现类是一个名字被加密的类(titan框架中
小万哥 小万哥
1年前
数据库操作入门:PyMongo 和 MongoDB 的基本用法
MongoDBMongoDB是一种流行的NoSQL数据库,它将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展PyMongoPython需要一个MongoDB驱动程序来访问MongoDB数据库。在本教程中,我们将使用MongoDB驱动程序"PyMo