MongoDBでオートインクリメントする

はじめに

MongoDBの_idにはオリジナルなObjectIDがついてるけどこれをMySQLとかでいうようなオートインクリメントさせたい時の話
調べたら公式にドキュメントがあった

のでこれをJavaで使ってみる

ライブラリの追加

3.3.0のドライバを追加しておく

1<dependency>
2    <groupId>org.mongodb</groupId>
3    <artifactId>mongo-java-driver</artifactId>
4    <version>3.3.0</version>
5</dependency>

countersコレクションの作成

参考ドキュメントの1番相当
コンソールからmongoDBにアクセスしてコレクションを予め作成しておく

1$ mongo
2> db.counters.insert({_id: "userid", seq: 0})
3WriteResult({ "nInserted" : 1 })

getNextSequenceの作成

参考ドキュメントの2番相当

 1    public Object getNextSequence(DB db){
 2        DBCollection counter = db.getCollection("counters");
 3        BasicDBObject find = new BasicDBObject();
 4        find.put("_id", "userid");
 5        BasicDBObject update = new BasicDBObject();
 6        update.put("$inc", new BasicDBObject("seq", 1));
 7        DBObject obj =  counter.findAndModify(find, update);
 8
 9        return obj.get("seq");
10    }

利用する

利用する時は上で作った関数を呼んでその結果を当該ドキュメントの_idとして扱うだけで良い
もしカウンタの値をリセットする時はdropして最初のinsertをもう1回すれば良い

 1MongoClient client = new MongoClient("127.0.0.1", 27017);
 2DB db = client.getDB("hoge");
 3
 4BasicDBObject document = new BasicDBObject();
 5document.put("_id", getNextSequence(db));
 6document.put("name", "ななし");
 7document.put("age",  10);
 8
 9DBCollection todolist = db.getCollection("hogehoge");
10todolist.insert(document);

参考記事