mongoDB _id 属性 说明

一般关系型数据库的id字段都是自增长的数字类型,但mongodb的_id字段非常奇怪,它能保证是唯一的,但它其实并不是一个简单类型,不是数字,也不是字符串。刚接触的时候,我差点以为它是个字符串了。

其实它是个特殊的对象,在mongodb自带的js shell里,你可以看到它是个object类型,有一系列的方法和属性,其中toString属性可以返回一个字符串。



这里值得注意的是,当我们取出来   _id  是object 类型后  .toString后不能用此字符串去查找,不能转换,只能用object类型来查找。。。。



详情可以看下以下文档:
http://www.mongodb.org/display/DOCS/Object+IDs
http://api.mongodb.org/python/current/api/bson/objectid.html#module-bson.objectid
### 实现 MongoDBID 的自增功能 #### 创建 `counters` 集合 为了实现 `_id` 字段的自动增长,首先需要创建一个名为 `counters` 的集合来存储序列号: ```javascript db.createCollection("counters")[^1] ``` 接着向该集合插入一条记录用于初始化计数器: ```javascript db.counters.insert({ _id: "userid", seq: 0 }) ``` 这里以 `"userid"` 为例说明如何设置初始。 #### 使用 `findAndModify` 命令更新计数 每当要插入新文档时,通过调用 `findAndModify()` 方法查找并修改对应的计数器条目,确保此过程具有原子性,防止多线程环境下发生冲突: ```javascript var ret = db.counters.findAndModify({ query: { _id: "userid" }, update: { $inc: { seq: 1 } }, new: true, upsert: true }); print(ret.seq); ``` 上述代码片段展示了如何安全地获取下一个可用编号,并将其打印出来。其中参数解释如下: - `query`: 定位到特定名称的计数器; - `update`: 对匹配的对象执行增量操作; - `new`: 返回被更改后的最新版本的数据项而非原始数据项; - `upsert`: 如果找不到符合条件的结果,则会先插入再返回新增加的内容; 最后,在准备存入的新文档中加入刚刚得到的唯一标识符作为 `_id` 属性即可完成整个流程的设计[^2]。 对于某些场景下可能存在的高并发请求情况,考虑到性能因素还可以考虑引入缓存机制或者其他分布式锁方案进一步优化效率可靠性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值