每个MongoDB的document都有一个_id字段作为它的第一个属性,这个值通常是一个BSON对象id,因此,这个id对于集合中的每个成员都是唯一的,如果用户插入一个document没有提供一个id,数据库将自动生成一个id,并存储在_id字段。
The BSON ObjectId Datatype
一个BSON ObjectID是由12个字节组成:4字节时间+3字节机器id+2字节进程id+3字节的数字
{ "_id" : ObjectId("4c691e72ed2a47b462dfa806") }
有时候我们的应用中需要自增长的数字型主键,MongoDB在这方面并没有给我们提供支持,我们需要加以改造,使其具有自增长主键生成的功能。此次的功能改造,依赖的是morphia开源项目(MongoDB在java语言上的ORM实现,http://code.google.com/p/morphia/),直接上代码吧。
首先定义一个保存各个 collection的主键增量值的系统配置collection:StoredSeqence
java 代码
-
-
-
-
-
-
-
- @Entity(noClassnameStored=true)
- public class StoredSeqence implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- @Id
- String collName;
-
- Long value;
-
-
- public StoredSeqence(){
-
- }
-
- public StoredSeqence(String collName) {
- this.collName = collName;
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-
- public String getCollName() {
- return collName;
- }
-
- public void setCollName(String collName) {
- this.collName = collName;
- }
-
-
-
-
- }
然后定义一个实体的基类,在基类中处理主键生成。
java 代码
-
-
-
-
-
-
-
- public abstract class LongPKMongoEO extends BaseMongoEO {
-
- @Id
- Long _id;
-
- @Transient
- protected Datastore ds;
-
-
-
- public void setDs(Datastore ds) {
- this.ds = ds;
- }
-
- @PrePersist
- void prePersist() {
-
-
-
- if (_id == null) {
- String collName = ds.getCollection(getClass()).getName();
- Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id",
- collName);
- StoredSeqence ss = q.get();
- if(ss==null){
- ss = new StoredSeqence(collName);
- ss.setValue(1l);
- }else{
- ss.setValue(ss.getValue()+1);
- }
- ds.save(ss);
- _id=ss.value;
- }
- }
-
- public Long getId() {
- return _id;
- }
-
- }
这样自增长主键的生成的主要功能基本上已经完成了,具体如何使用,接下来将根据实际的项目再做介绍,请继续关注我的博客。
原文:http://www.po-soft.com/hi/yongtree/blog/2157
分享到:
相关推荐
10. **自动增长的 id**:与 SQL 数据库中的自动递增主键不同,MongoDB 并不提供类似的功能。虽然 ObjectId 可以视为一种自动增长的机制,但它基于时间戳和其他因素生成,而不是简单的序列号。 在实际操作 MongoDB ...
5. **自增长主键** - MongoDB中的每个文档都有一个 `_id` 字段作为主键。如果在插入时未指定 `_id`,系统会自动生成一个`ObjectId`。 6. **插入操作** - **四种插入数据的方法**: - **方法1**:使用`...
默认情况下,MongoDB 会为 `@Id` 字段生成唯一的 ObjectId,但在这个示例中似乎想要实现自增长的整数主键。为了实现这一目标,我们可以使用自定义 ID 生成策略。一种可能的方法是在保存文档前先查询最大 ID,然后加 ...
通过这种方式,可以在不内置自增ID功能的情况下,确保在并发环境下安全地生成唯一的自增ID。不过,这种方法需要额外的存储空间和处理步骤,对于大规模并发写入的情况,可能需要评估性能影响。在设计数据库架构时,应...
**四、自增长主键** MongoDB 的主键是 `_id` 字段,通常使用 `ObjectId` 类型。不过,开发者也可以自定义 `_id`,只要保证其唯一性。例如,创建一个生成 `ObjectId` 的工具方法: ```java public class Tools { ...
- 可以自定义主键,但$inc命令通常用于更新计数器,而不是生成自增长主键。 5. MongoDB的`find()`方法: - `find()`方法用于查询文档,可以接受查询条件并返回结构化的文档。 - `projection`参数是可选的,用于...
9. **数据分析与报表**:为决策提供依据,系统可能包含数据分析功能,如销售统计、库存分析等,以及可视化报表展示。 10. **性能优化**:针对大量并发访问和大数据处理,可能探讨了缓存策略、负载均衡、数据库优化...
- **主要需求**:客户需求增加、客户登记时间分散、收益增长等因素要求系统能高效处理客房预订、空闲情况、客户信息、住宿费用等数据。 - **功能需求**: - 客户登记 - 房间管理 - 客户查询 - 房间查询 - 收入...
MySQL 面试题目知识点汇总 本资源摘要信息涵盖了 ...* 数据库自增长序列或字段、UUID、Redis 生成 ID、Twitter 的 snowflake 算法、利用 zookeeper 生成唯一 ID、MongoDB 的 ObjectId 等都是分布式主键方案的选择。
- **自增长字段索引**:InnoDB中的自增长字段必须单独建立索引;MyISAM允许与其他字段联合建立索引。 - **表清空效率**:MyISAM清空表时会重新构建表,效率较高;而InnoDB则是一行一行地删除,效率较低。 #### ...
- **自动增长**(`AUTO_INCREMENT`): 自动为新记录分配唯一的ID值。 - **注释**: 可以为表、列等添加注释信息,便于理解。 以上内容概述了MySQL的核心要点,包括基本概念、操作、优化策略、部署方案、数据类型等方面...
支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持...
支持全局序列号,解决分布式下的主键生成问题。分片规则丰富,插件化开发,易于扩展。强大的web,命令行监控。支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。支持密码加密...
支持全局序列号,解决分布式下的主键生成问题。 分片规则丰富,插件化开发,易于扩展。 强大的web,命令行监控。 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server、mongodb、巨杉。 支持密码...