• 售前

  • 售后

热门帖子
入门百科

mongodb字段值自增长实现代码

[复制链接]
123456825 显示全部楼层 发表于 2021-8-14 14:49:47 |阅读模式 打印 上一主题 下一主题
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是体系自动生成的12字节唯一标识。但在某些情况下,我们大概需要实现 ObjectId 自动增长功能。由于 MongoDB 没有实现这个功能,我们可以通过编程的方式来实现,以下我们将在 counters 集合中实现_id字段自动增长。
1.创建计数器集合

期望_id字段从1,2,3,4到n,启动一个自动递增的整数序列,如:
  1. {
  2.   "_id":1,
  3.   "title": "标题",
  4.   "content": "内容1",
  5.   "type": "类型"
  6. }
复制代码
为此,创建 counters 集合,序列字段值可以实现自动长:
  1. db.createCollection("counters")
复制代码
初始化集合,以objId作为主键,sequence_value 字段是序列通过自动增长后的一个值:
  1. db.counters.insert({_id:"objId",sequence_value:0})
复制代码
2.查询序列号

查询返回更新后的序列号
  1. db.counters.findAndModify({
  2.   query: {_id: "objId" },
  3.   update: {$inc:{sequence_value:1}},
  4.   new: true
  5. }).sequence_value;
复制代码
利用符表明:
$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键举行增减的利用;
  1. db.collection.findAndModify({
  2.   query: <document>, //定义关于哪些记录需要修改的选择标准
  3.   sort: <document>, //确定选择标准检索多个文档时应修改的文档
  4.   new: <boolean>, //表示将显示修改后的文档
  5.   fields: <document>, //指定要返回的字段集
  6.   upsert: <boolean> //如果选择标准无法检索文档,则创建一个新文档
  7.   remove: <boolean> //为true,query指定的文档将从数据库中删除
  8. )}
复制代码
3.测试

创建测试集合sms:
  1. db.createCollection("sms")
复制代码
在sms集合中新增文档,实现_id自增长:
  1. db.sms.insert({
  2.   _id: db.counters.findAndModify({query:{_id: "objId" },update: {$inc:{sequence_value:1}},"new":true}).sequence_value,
  3.   title: "标题1",
  4.   content: "短信1",
  5.   type: "1"
  6. })
复制代码
查询sms集合:
  1. db.sms.find({}).sort({_id:1})
复制代码

4.java实现

java实现以上功能,数据库驱动版本差异运行效果有差异,仅供参考:
  1. private MongoDatabase conn;
  2. static{
  3.   this.conn = getDatabase(databaseName);
  4. }
  5. /**
  6. * 连接数据库
  7. * @param databaseName 数据库名称
  8. * @return       数据库连接对象
  9. */
  10. private static MongoDatabase getDatabase(databaseName){
  11.   MongoDatabase mongoDatabase = null;
  12.   try{  
  13.     // 连接到 mongodb 服务
  14.     MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
  15.   
  16.     // 连接到数据库
  17.     MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
  18.     System.out.println("Connect to database successfully");
  19.    
  20.   }catch(Exception e){
  21.     System.err.println( e.getClass().getName() + ": " + e.getMessage() );
  22.   }
  23.   return mongoDatabase;
  24. }
  25. /**
  26. * 获取最新序列号
  27. * @return 序列号
  28. */
  29. private static int getNextSequenceValue(){
  30.   DBCollection collection = conn.getCollection("counters");
  31.   DBObject query = new BasicDBObject("_id", new BasicDBObject("$eq", "objId"));
  32.   DBObject newDocument =new BasicDBObject();
  33.   newDocument.put("$inc", new BasicDBObject().append("sequence_value", 1));
  34.   newDocument.put("new": true);
  35.   DBObject ret = collection.findAndModify(query, newDocument);
  36.   if (ret == null){
  37.     return 0;
  38.   }else{
  39.     return (Integer)ret.get("sequence_value");
  40.   }
  41. }
  42. /**
  43. * 新增集合文档
  44. */
  45. public static void addSms(){
  46.   int id = getNextSequenceValue();
  47.   if(id != 0){
  48.     DBCollection collection = conn.getCollection("sms");
  49.     List<Document> documents = new ArrayList<Document>();
  50.     for(int i = 0; i < 20; i++){
  51.       int id = getNextSequenceValue();
  52.       Document document = new Document("_id", id).
  53.       append("title", "标题" + i).
  54.       append("content", "短信" + i).
  55.       append("type", 1);
  56.       documents.add(document);
  57.     }
  58.     collection.insertMany(documents);
  59.     System.out.println("文档插入成功");
  60.   }
  61. }
  62. /**
  63. * 查询集合
  64. */
  65. public static void findSms(){
  66.   DBCollection collection = conn.getCollection("sms");
  67.   FindIterable<Document> findIterable = collection.find();
  68.   MongoCursor<Document> mongoCursor = findIterable.iterator();
  69.   while(mongoCursor.hasNext()){
  70.     System.out.println(mongoCursor.next());
  71.   }
  72. }
复制代码
5.总结

有了字段自增长功能,可以实现订单流水号、编码的流水号等功能,可以实现同MySQL自增字段、Oracle序列的雷同效果。
到此这篇关于mongodb字段值自增长实现的文章就介绍到这了,更多相关mongodb字段值自增长内容请搜刮草根技术分享以前的文章或继承欣赏下面的相关文章希望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作