1. ホーム
  2. データベース
  3. モンゴルディーブ

mongodb フィールド値自己増殖型実装コード

2022-01-20 20:02:31

MongoDBにはSQLのような自動成長機能はありません。MongoDBの_idはシステムが自動生成する12バイトの一意な識別子です。しかし、場合によっては ObjectId の autogrow を実装する必要があるかもしれません。MongoDB はこの機能を実装していないので、プログラム的に実現します。ここでは、カウンタコレクションに _id フィールドの自動成長を実装してみます。

1. カウンタコレクションの作成

expect_id フィールドは,1,2,3,4 から n までの整数の自動インクリメント列を開始します,例.

{
  "_id":1,
  "title": "title",
  "content": "content1",
  "type": "type"
}

そのためには、シーケンスフィールドの値を自動長で実装できるカウンタコレクションを作成します。

db.createCollection("counters")

によってシーケンスが自動生成された後、objId を主キー、sequence_value フィールドを値として、コレクションを初期化します。

db.counters.insert({_id:"objId",sequence_value:0})

2. シーケンス番号の問い合わせ

このクエリは、更新されたシリアル番号を返します

db.counters.findAndModify({
  query: {_id: "objId" },
  update: {$inc:{sequence_value:1}},
  new: true
}).sequence_value;

演算子の解釈

$inc は、値が数値であるドキュメントのキーをインクリメントまたはデクリメントすることができます(要件を満たす数値のみ可能です)。

db.collection.findAndModify({
  query: <document>, //define selection criteria for which records to modify
  sort: <document>, //define selection criteria to retrieve multiple documents when the document should be modified
  new: <boolean>, //indicates that the modified document will be displayed
  fields: <document>, //Specify the set of fields to return
  upsert: <boolean> // if the selection criteria can not retrieve the document, then create a new document
  remove: <boolean> // true, the document specified by query will be removed from the database
)}

3. テスト

テストコレクションのSMSを作成します。

db.createCollection("sms")

smsコレクションに新しいドキュメントを追加して、自己増殖する_idを実現する。 

db.sms.insert({
  _id: db.counters.findAndModify({query:{_id: "objId" },update: {$inc:{sequence_value:1}},"new":true}).sequence_ value,
  title: "title1",
  content: "SMS1",
  type: "1"
})

smsコレクションを問い合わせる。

db.sms.find({}).sort({_id:1})

4. javaの実装

上記機能のJava実装は、データベースドライバのバージョンによって動作が異なりますので、参考程度にご覧ください。

private MongoDatabase conn; static{ this.conn = getDatabase(databaseName)。 /** * データベースへの接続 * @param databaseName データベース名 * データベース接続オブジェクトを返します。 */ private static MongoDatabase getDatabase(databaseName){... MongoDatabase mongoDatabase = null; try{ // mongodb サービスに接続する MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // データベースに接続する MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName)。 System.out.println("Connect to database successfully")を実行します。 }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ) を実行します。 return mongoDatabase; /** * 最新シリアル番号の取得 * @return シリアル番号 */ プライベートスタティック int getNextSequenceValue(){ DBCollection collection = conn.getCollection("counters"); DBObject query = new BasicDBObject("_id", new BasicDBObject("$eq", "objId")); DBObject newDocument = new BasicDBObject()。 newDocument.put("$inc", new BasicDBObject().append("sequence_value", 1)); newDocument.put("new": true); DBObject ret = collection.findAndModify(query, newDocument); if (ret == null){ もし 0を返します。 }else{ return (Integer)ret.get("sequence_value"); } } /** * 新しいコレクションドキュメント */ public static void addSms(){ int id = getNextSequenceValue()。 if(id != 0){ 訂正 DBCollection collection = conn.getCollection("sms"); List<Document> documents = new ArrayList<Document>(); for(int i = 0; i < 20; i++){... int id = getNextSequenceValue(); Document document = new Document("_id", id). append("title", "title" + i). append("content", "SMS"+i).を追加します。 append("type", 1); documents.add(document)を実行します。 collection.insertMany(documents)を実行します。 System.out.println("document inserted successfully")を実行します。 } /** * クエリーコレクション */ public static void findSms(){ DBCollection collection = conn.getCollection("sms"); FindIterable<Document> findIterable = collection.find(); MongoCursor<Document> mongoCursor = findIterable.iterator(); while(mongoCursor.hasNext()){。 System.out.println(mongoCursor.next()); } }

5. 概要

フィールドの自己成長機能を使えば、MySQLの自己成長フィールドやOracleのシーケンス、その他オーダーフロー番号やエンコードフロー番号などと同じ効果を得ることができます。

この記事はmongodbのフィールド値の自己成長について書かれています。mongodbフィールド値自己成長については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。