mongodb フィールド値自己増殖型実装コード
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フィールド値自己成長については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。
関連
-
macシステムでのmongoDBデータベースのインストールと設定
-
MongoDBのログ切り出しの3つの方法のまとめ
-
Mongoサービス再起動例外問題の対処方法
-
プロファイルを使用してMongoDBで遅いクエリを分析する手順
-
2021年最新版Windows 10システムMongoDBデータベースインストールと構成環境
-
MongoDBイージースタートチュートリアル(インストール、基本概念、ユーザーの作成)
-
MongoDBの役割管理について説明する
-
MongoDB監視ツール mongostat と mongotop の使用方法
-
[解決済み】SocketException: アドレスはすでに使用中です。
-
MongoDBクエリ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot + mongodbによる緯度経度座標による平坦地マッチング方式
-
Centos8でMongoDBをインストールする詳細な手順
-
mongodbでコネクションとログをクリアする正しい方法
-
MongoDBユーザー関連操作
-
MongoDBプライマリシャード概要
-
MongoDBのレンジスライスキーとハッシュスライスキーについて説明します。
-
MongoTemplateのidによるクエリがNULLの場合について
-
MongoDB起動時の例外エラーと正しいシャットダウン方法
-
Mongodbの包括的なまとめ
-
[MongoDB] 127.0.0.1:27017 への接続に失敗しました、理由。接続が拒否されました