MongoDB学习-->设置通用的自增ID替代ObjectId

插入mongodb数据时,会为其分配一个随机id,想要设置通用的自增id,可以进行以下操作

1.创建自增序列

 1 package com.tangzhe.autoid;
 2 
 3 import lombok.Data;
 4 import org.springframework.data.annotation.Id;
 5 import org.springframework.data.mongodb.core.mapping.Document;
 6 import org.springframework.data.mongodb.core.mapping.Field;
 7 
 8 /**
 9  * Created by 唐哲
10  * 2018-03-14 21:26
11  * 自增序列
12  */
13 @Document(collection = "sequence")
14 @Data
15 public class Sequence {
16 
17     @Id
18     private String id; //序列的id
19 
20     @Field("coll_name")
21     private String collName; //coll的name
22 
23     @Field("seq_id")
24     private Long seqId; //coll的id,自增id
25 
26 }

2.创建AutoId注解

 1 package com.tangzhe.autoid;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 /**
 9  * Created by 唐哲
10  * 2018-03-14 21:55
11  */
12 @Retention(RetentionPolicy.RUNTIME)
13 @Target({ElementType.FIELD})
14 public @interface AutoId {
15 }

3.创建需要使用自增ID的实体类

 1 package com.tangzhe.autoid;
 2 
 3 import lombok.Data;
 4 import org.springframework.data.mongodb.core.mapping.Document;
 5 import org.springframework.data.mongodb.core.mapping.Field;
 6 
 7 /**
 8  * Created by 唐哲
 9  * 2018-03-14 21:56
10  */
11 @Document(collection = "stu_info")
12 @Data
13 public class StuInfo {
14 
15     @AutoId
16     private Long id;
17 
18     @Field("name")
19     private String name;
20 
21 }

4.自增id监听器

 1 package com.tangzhe.autoid;
 2 
 3 import java.lang.reflect.Field;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.data.mongodb.core.FindAndModifyOptions;
 6 import org.springframework.data.mongodb.core.MongoTemplate;
 7 import org.springframework.data.mongodb.core.mapping.Document;
 8 import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
 9 import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
10 import org.springframework.data.mongodb.core.query.Criteria;
11 import org.springframework.data.mongodb.core.query.Query;
12 import org.springframework.data.mongodb.core.query.Update;
13 import org.springframework.util.ReflectionUtils;
14 import org.springframework.util.ReflectionUtils.FieldCallback;
15 
16 /**
17  * 自增id监听器
18  */
19 public class SaveMongoEventListener extends AbstractMongoEventListener<Object> {
20     
21     @Autowired
22     private MongoTemplate mongoTemplate;
23     
24     @Override
25     public void onBeforeConvert(BeforeConvertEvent<Object> event) {
26         if (event != null && event.getSource() != null) {
27             ReflectionUtils.doWithFields(event.getSource().getClass(), new FieldCallback() {
28                 
29                 @Override
30                 public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
31                     if (field.isAnnotationPresent(AutoId.class)) {
32                         String collName = event.getSource().getClass().getSimpleName();
33                         if (event.getSource().getClass().isAnnotationPresent(Document.class)) {
34                             collName = event.getSource().getClass().getAnnotation(Document.class).collection();
35                         }
36                         field.set(event.getSource(), getNextId(collName));
37                     }
38                 }
39                 
40             });
41         }
42     }
43     
44     public Long getNextId(String collName) {
45         Query query = Query.query(Criteria.where("collName").is(collName));
46         Update update = new Update().inc("seqId", 1);
47         FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
48         return mongoTemplate.findAndModify(query, update, options, Sequence.class).getSeqId();
49     }
50 
51 }

5.测试自增ID

 1 package com.tangzhe.autoid;
 2 
 3 import com.mongodb.BasicDBObject;
 4 import org.junit.Test;
 5 import org.junit.runner.RunWith;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.boot.test.context.SpringBootTest;
 8 import org.springframework.data.mongodb.core.FindAndModifyOptions;
 9 import org.springframework.data.mongodb.core.MongoTemplate;
10 import org.springframework.data.mongodb.core.query.Criteria;
11 import org.springframework.data.mongodb.core.query.Query;
12 import org.springframework.data.mongodb.core.query.Update;
13 import org.springframework.test.context.junit4.SpringRunner;
14 
15 /**
16  * Created by 唐哲
17  * 2018-03-14 21:29
18  * 自增id测试
19  */
20 @RunWith(SpringRunner.class)
21 @SpringBootTest
22 public class AutoIdTest {
23 
24     @Autowired
25     private MongoTemplate mongoTemplate;
26 
27     //@Test
28     public void testAutoId() {
29         Query query = Query.query(Criteria.where("collName").is("stu_info"));
30         Update update = new Update().inc("seqId", 1);
31         FindAndModifyOptions options = FindAndModifyOptions.options().upsert(true).returnNew(true);
32         Long stuInfoId = mongoTemplate.findAndModify(query, update, options, Sequence.class).getSeqId();
33 
34         mongoTemplate.getCollection("stu_info").save(new BasicDBObject("_id", stuInfoId).append("name", "zhangsan"));
35     }
36 
37     /**
38      * 测试自增id监听器
39      */
40     //@Test
41     public void testSaveMongoEventListener() {
42         StuInfo stuInfo = new StuInfo();
43         stuInfo.setName("lisi");
44         mongoTemplate.save(stuInfo);
45     }
46 
47 }

 

posted on 2018-03-19 09:27  动物管理猿  阅读(690)  评论(0编辑  收藏  举报

导航