public class hiMongo extends Object
// JAVAプログラム hiMongo.DB db=hiMongo.use("db01"); // database 選択 db.in("coll_01") // collection 選択 .find("{type:'A'}","{_id:0}") // typeが'A'のレコード .sort("{_id:-1}") // _idで逆向きにソート .limit(3) // 個数制限 .getJsonList(hiU.REVERSE) // 反転したリスト取得 .forEach(Rd->System.out.println(Rd));// レコード表示
hiMongoはドキュメント指向のDataBaseであるmongoDBにアクセスするjavaライブラリです。
hiMongoはmongo-java-driverのラッパーです。
用語: | ||
mson | : mongoDB用の拡張JSON記述;ObjectId(...),ISODate(...)あり | |
json | : 標準JSON記述 | |
hson | : msonにコメント等の入力解析拡張を行ったもの | |
Database | : データベース。名前付きcollectionの集合 | |
Collection | : レコードの集合 | |
レコード | : 入出力データの基本単位,名前付きフィールドの集合 | |
フィールド | : レコード内の名前付きの値 | |
ノード | : プログラム上でのデータ要素。データはノードのツリー構造となる | |
Document | : プログラムでのmsonのノード実装クラスおよびノードデータ mongoDBではレコードの事を'ドキュメント'と呼ぶとされているが、ここではプログラム上で限定される Document クラスを指す | |
bson | : msonのバイナリ表現(プログラム上およびDB上)Bson クラスはJSON式の構造は採っておらず、hiMongoでは対象外としています。
| |
hiJSON | :hiMongoが使用している Otsuラリブラリ(エントリ) / hiNoteパッケージ に属するクラスです。 |
JavaでmongoDB;hiMongoの基本
mongoDBとは
JavaでmongoDB;hiMongo-APIの基本;レコード取得
次のプログラムはJava用のmongoDBライブラリhiMongoの使用例です。
// JAVAプログラムhiMongo.DB
db=hiMongo.use("db01")
; // database 選択 db.in("coll_01")
// collection 選択.find("{type:'A'}","{_id:0}")
// typeが'A'のレコード.sort("{_id:-1}")
// _idで逆向きにソート.limit(3)
// 個数制限.getJsonList(hiU.REVERSE)
// 反転したリスト取得.forEach(Rj->System.out.println(Rj))
;// レコード表示
mongoDBのCUIであるmongo-shellの次の手続きに相当します。
// mongo shell script use db01; db.coll_01. // collection 選択 find({type:'A'},{_id:0}). // typeが'A'のレコード sort({_id:-1}). // _idで逆向きにソート limit(3). // 個数制限 toArray().reverse(). // 反転したリスト取得 forEach(Rd=>print(JSON.stringify(Rd)));// 要素表示
typeフィールドが'A'であるレコードの最新3個を取得しています。
実際にビルド・実行できるフルコードと実行結果を示します
本文書に掲載するプログラムおよびプログラムの断片は次の習慣に沿って書かれています。
APIの基本;レコード挿入
レコードの挿入では次の様にレコード内容を拡張JSON(mson)で与えます。
// JAVAプログラム
hiMongo.DB db=hiMongo.use("db01")); // database 選択
db.in("coll_01") // collection 選択
.insertOne("{type:'A',value:21,date:{$date:1597648050000}}")
;
時刻は{$date:Unix-Epoch}またはISODate('グリニッジ日時')の形です。
mongo-shellではnew Date(Unix-Epoch)またはISODate('グリニッジ日時')となります。
// mongo-shell use db01 db.coll_01. insertOne({type:'A',value:21,date:new Date(1597648050000)});
APIの基本;カスケード式
次のようなAPIが用意されており、冒頭のようなカスケード式で呼び出すことも各型の変数で結果を受けて改めて呼び出すことも出来ます
hiMongo#use => DB DB#in => Collection Collection#find => Finder Finder#sort => Finder Finder#limit => Finder Finder#skip => Finder Finder#forEachXXX => Finder Finder#getXXXList => ArrayList<XXX> Collection#aggregate => Aggregator Aggregator#forEachXXX => Aggregator Aggregator#getXXXList => ArrayList<XXX> Collection#insertOne => Collection Collection#insertMany => Collection Collection#updateOne => Collection Collection#updateMany => Collection Collection#replaceOne => Collection Collection#deleteOne => Collection Collection#deleteMany => Collection
各型のインスタンスで受けて操作する場合は次のような形です。
hiMongo.DB db = hiMongo.use("db01"); hiMongo.Collection _coll= db.in("coll_01"); _coll.find("{}","{_id:0}"); _coll.sort("{_id:-1}"); _coll.limit(3); ArrayList&lr;String> _recs=coll.getJsonList(hiU.REVERT); for(Document _rec:_recs)System.out.println(_rec);
カスケード式では次の様になります。
hiMongo.DB db = hiMongo.use("db01"); db.in("coll_01") // DBのget() .find("{}","{_id:0}") // Collectionのfind() .sort("{_id:-1}") // Finderのsort() .limit(3) // Finderのlimit() .getJsonList(hiU.REVERT) // Finder(Accessor)のgetJsonList() .forEach(Rj->System.out.println(Rj)); // ArrayListのforEach() // use()から続けることも可能ですが、習慣上DBにはdbという変数を割り当てます。
APIの基本;Java変数、辞書管理変数(#変数)
レコード情報、フィールド情報は
の形態でDBから読み取られます。
Java変数は直接Javaプログラムで取り扱います。
import hi.db.hiMongo; public class Test { public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); ArrayList<String> _recs=db.in("coll_01").find("{type:'B'}").getJsonList(); // 変数_recsをJavaで処理
辞書変数にはDBスコープとforスコープがあります。forスコープはforOne,forEachなどのラムダ式内でアクセス可能でラムダ式では参照できません。
辞書変数は先頭が'#'である名前で特定されます。
get()などの手続きで取り出すことができる他、find()引数内に置かれた#変数もfind実行時に展開されます。
import hi.db.hiMongo; public class Test { public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); db.in("coll_01") .find("{type:'B'}") // type=='B'のレコードの .forOne("{#B_id:_id}",Fi-> // _idを#B_idとして取得 Fi.find("{_id:{$gte:#B_id}}","{_id:0}") // _id#B_id以上のレコード検索 .forEachMson(Rm->System.out.println(Rm)));// 表示(Rmは値のラムダ式引数) } } // forOneのラムダ引数はFinderです。FinderのfindはカレントのCollectionに対して出されます。 *** DB {type:'A',value:12.3,date:ISODate('2020-08-17T07:07:00.000Z')} ,{type:'A',value:4.56,date:ISODate('2020-08-17T07:07:10.000Z')} ,{type:'B',value:2001,date:ISODate('2020-08-17T07:07:20.000Z')} // これ以降が欲しい ,{type:'A',value:7.89,date:ISODate('2020-08-17T07:07:30.000Z')} ,{type:'A',value:0.12,date:ISODate('2020-08-17T07:07:40.000Z')} *** 実行結果 ----- 14sharpValue ----- {'type':'B', 'value':2001, 'date':ISODate('2020-08-17T07:07:20.000Z')} {'type':'A', 'value':7.89, 'date':ISODate('2020-08-17T07:07:30.000Z')} {'type':'A', 'value':0.12, 'date':ISODate('2020-08-17T07:07:40.000Z')}top、API
find(検索)の引数と結果
find
は2つの引数を持ちます。検索条件と取得フィールドです。
検索条件
検索条件には次の様な記述が出来ます。
条件 | 記述例 |
無条件 | find()またはfind("{}") |
フィールド値の単純一致 | find("{name:'A'}") |
フィールド値の大小判断 | find("{value:{$gt:100}}")
形式: {field:{$eq:値}} == {field:{$ne:値}} != {field:{$lt:値}} < {field:{$lte:値}} <= {field:{$gt:値}} > {field:{$gte:値}} >= {field:{$in:[値,..]}} 含まれる {field:{$nin:[値,...]}} 含まれない |
条件の組み合わせ | find("{$and:[{name:'A'},{value:{$gt:100}}]}")
形式: {$and:[{条件},{条件},...]} {$or:[{条件},{条件},...]} {$not:{条件}} |
部分一致、正規表現 |
find("{name:/et/}") nameがetを含む find("{name:/^T.*sky$/}") nameがTで始まりskyで終わる find("{name:/(ba|ab)/}") nameがbaまたはabを含む |
取得フィールド
取得フィールドの指定は{}内に「フィールド名:0または1」を必要分カンマで繋いで記述します。
0は非表示(取得しない)を1は表示(取得する)を表します。
指定は_idフィールドとその他の利用者フィールドでは意味が少し異なります。
利用者フィールドに1を指定した場合、指定しないフィールドは非表示となります。0を指定した場合指定フィールドが非表示となります。
利用者フィールドの指定に0と1が混在することは許されません。
find() // 全て取得 find("{}") // 全て取得 find("{}","{}") // 全て取得 find("{}","{_id:0}") // _idフィールド以外全て取得 { "A" : 10, "B" : 20, "C" : 30, "D" : 40 } { "A" : 11, "B" : 21, "C" : 31, "D" : 41 } find("{}","{_id:0,A:1}") // Aフィールドのみ取得 { "A" : 10 } { "A" : 11 } find({},{_id:0,A:0}) // _id,Aフィールド以外取得 { "B" : 20, "C" : 30, "D" : 40 } { "B" : 21, "C" : 31, "D" : 41 } find("{}","{_id:0,A:1,C:1}") // A,Cフィールドのみ取得 { "A" : 10, "C" : 30 } { "A" : 11, "C" : 31 } find("{}","{_id:0,A:0,C:0}") // _id,A,Cフィールド取得以外取得 { "B" : 20, "D" : 40 } { "B" : 21, "D" : 41 } find("{}","{_id:0,A:0,C:1}") // エラー
取得しないと指定したフィールドでも検索条件、ソート条件に使用できます。
top、API検索結果の全レコードをArrayListで取得
find
の戻りはhiMongo.Finder
です。
sort()
,limit()
など幾つかの手順を経て最終的にはgetXXXList()メソッドで結果をArrayList<T>
にして戻します。
得られるリストは次のものです。
要素の型 | 取得メソッド | 説明 |
Document | getDocumentList |
mongoDBのデータノードです。 基本的にはJSONに対応するObjectのツリーです。 Document はMap<String,Object> 型の辞書です。Stringや数値などの基本タイプの他ObjectId クラス,Date クラスを持ちます。
|
クラスインスタンス | getClassList |
利用者クラスにマップしたデータが得られます。 最も間違いが起こりにくい方法です。 |
hiJSON.Probe | getProbeList |
データノードの探索機です。 探索対象となるノード自体は getDocumentList() で得られるものと同じDocument とその構成要素(文字列やリスト、数値など)です。Document はMap<String,Object>でありhiJSON.Probe では辞書として扱われます。
|
String(mson) | getMsonList |
mongoの拡張JSON形の文字列。 ObjectId("..."),ISODate("...")が用いられます。 |
String(json) | getJsonList |
標準JSON形の文字列。 {"$oid":"..."},{"$date":"..."}が用いられます。 |
getXxxList()にhiU.REVERSEを付けると逆並びとなります。
hiU
は汎用ライブラリotsu.hiNote
の代表クラスです。
Document
で取得
find
の結果をgetDocumentList()
を用い検索結果をDocument
のリストとして得ることが出来ます。
引数としてhiU.REVERSEを付けると逆順のリストが得られます。
hiMongo.DB db=hiMongo.use("db01"); ArrayList<Document> _dlist =db.in("coll_01") .find("{}","{_id:0}") .getDocumentList();top、API
利用者定義クラス・インスタンスとして取得
find
の結果をgetClassList()
を用い検索結果を利用者定義のクラス・インスタンスのリストとして得ることが出来ます。
class MyRecord { // レコード内容 String type; double value; Date date; } ----- double _start_date=取得開始レコードのunixエポック ArrayList<MyRecord> _recs =db.in("coll_01") .find("{$and:["+ "{type:'A'},"+ "{date:{$gte:{$date:"+_start_date+"}}}"+ "]}", "{_id:0}") .getClassList(MyRecord.class); for(MyRecord _rec:_recs){ System.out.println("value="+_rec.value); }
要素の過不足がチェックされますので、チェックをオフにする必要がある場合はgetClassList()の前にチェックをオフにする指定を入れます。
hiMongo.Finder.without_option(long)
を用います。指定するフラグはhiJSONのパーズオプションを参照してください
ArrayList<MyClass> _recs= db.in("coll_01") .find("{}","{_id:0}") .without_option(hiU.CHECK_UNKNOWN_FIELD // クラスにないフィールドを無視する |hiU.CHECK_UNSET_FIELD) // セットされないフィールドをエラーとしない .getClassList();top、API
汎用データ探索機hiJSON.Probe
で取得
find
の結果をgetProbeList()
を用い検索結果をhiJSON.Probe
のリストで受け取ることが出来ます。
hiJSON.Probe
は汎用ノードの探索機で辞書(Map<String,Object>).リスト(List<Object>),文字列,数値などで構成されるツリーを探査するメソッドを持ちます。
Document
は辞書/Map<String,Object>ですのでProbeの探索対象となります。
要素へのアクセスは文字列による名前での指定となります。
double _start_date=取得開始レコードのunixエポック ArrayList<hiJSON.Node> _recs =db.in("coll_01") .find("{$and:["+ "{type:'A'},"+ "{date:{$gte:{$date:"+_start_date+"}}}"+ "]}", "{_id:0}") .getProbeList(); for(hiJSON.Probe _probe:_recs){ System.out.println("value="+_probe.at("value").getDouble()); }
JSON文字列、拡張JSON文字列で取得
find
の結果をgetJsonList()
を用いれば純粋なJSON文字列リスト、
getMsonList()
を用いれば拡張JSON文字列のリストとして得ることが出来ます。
hiMongo.DB db=hiMongo.use("db01"); ArrayList<String> _jsons =db.in("coll_01") .find("{}","{_id:0}") .getJsonList();top、API
検索結果1レコード毎に取得しラムダ式の引数とする
forEach型()メソッドを使うとfindで取得するレコード一個毎に変数としラムダ式に与えることができます。
import hi.db.hiMongo; import otsu.hiNote.*; import java.util.*; public class Test { static class MyRecord { String type; double value; Date date; } public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); db.in("coll_01") .find("{type:'A'}","{_id:0}") .forEachDocument(Rd->System.out.println("Rd "+Rd)) .forEachMson(Rm->System.out.println("Rm "+Rm)) .forEachJson(Rj->System.out.println("Rj "+Rj)) .forEachClass(MyRecord.class, Rc->System.out.println("Rc "+hiU.str(Rc))) .forEachProbe(Rp->System.out.println( "Rp "+Rp.get("type")+"/"+Rp.get("value")+"/" +Rp.get("date"))) ; } } *** ----- 16forEachTypes ----- Rd Document{{type=A, value=12.3, date=Mon Aug 17 16:07:00 JST 2020}} Rd Document{{type=A, value=4.56, date=Mon Aug 17 16:07:10 JST 2020}} Rd Document{{type=A, value=7.89, date=Mon Aug 17 16:07:30 JST 2020}} Rd Document{{type=A, value=0.12, date=Mon Aug 17 16:07:40 JST 2020}} Rm {'type':'A', 'value':12.3, 'date':ISODate('2020-08-17T07:07:00.000Z')} Rm {'type':'A', 'value':4.56, 'date':ISODate('2020-08-17T07:07:10.000Z')} Rm {'type':'A', 'value':7.89, 'date':ISODate('2020-08-17T07:07:30.000Z')} Rm {'type':'A', 'value':0.12, 'date':ISODate('2020-08-17T07:07:40.000Z')} Rj {"type":"A", "value":12.3, "date":{"$date":1597648020000}} Rj {"type":"A", "value":4.56, "date":{"$date":1597648030000}} Rj {"type":"A", "value":7.89, "date":{"$date":1597648050000}} Rj {"type":"A", "value":0.12, "date":{"$date":1597648060000}} Rc {type="A", value=12.3, date=Mon Aug 17 16:07:00 JST 2020} Rc {type="A", value=4.56, date=Mon Aug 17 16:07:10 JST 2020} Rc {type="A", value=7.89, date=Mon Aug 17 16:07:30 JST 2020} Rc {type="A", value=0.12, date=Mon Aug 17 16:07:40 JST 2020} Rp A/12.3/Mon Aug 17 16:07:00 JST 2020 Rp A/4.56/Mon Aug 17 16:07:10 JST 2020 Rp A/7.89/Mon Aug 17 16:07:30 JST 2020 Rp A/0.12/Mon Aug 17 16:07:40 JST 2020
現版ではまとめてレコードを取得し、一個ずつラムダ式に渡しています。
「確実に」1個ずつDBから取得しながらラムダ式に与える形にすることを検討中です。forEachでなくforOneByOneとして追加する可能性もあります。
辞書管理変数、パラメタ内変数展開、再帰探索
取得した情報をラムダ式の直接の引数とはせず、辞書管理する変数に置くことにより、柔軟なプログラム構造をとることができます。
find()
などのパラメタ上に変数名を記述すると実行時の情報で展開されます。
なおfind()
は基本的にはhiMongo.Collection
のメソッド
ですが、hiMongo.Finder
から呼ぶことも可能で、カレントのhiMongo.Collection
を使った呼び出しとなります。
検索結果をラムダスコープ変数(#変数)に入れラムダ式実行
forEach()
,forOne()
,forEachRecursive()
,forOneRecursive()
の各メソッドではforスコープの変数が定義され、get()
などのメソッドで取得できるほか、find()
他のメソッドで引数内の変数記述が展開されます。
項目 | 例 | 説明 |
find などdbアクセス |
db.setValue("#TARGET","A"); db.in("coll_01") .find("{name:#TARGET}}") |
#TATGETに値を設定してあれば展開されfindが実行されます |
get |
Object _target=get("#TARGET"); |
Javaプログラム上で変数内容を取得できます。得られるのオブジェクトです。 |
disp |
String _text=disp("target=#TARGET name=#NAME")); |
Javaプログラム上で、文字列上に置いた変数を文字列に展開します。展開後の文字列が得られます。 |
eval |
Object _obj=eval("{$gt:{$calc:'#CUR.date+17000'}}")); |
拡張JSON記述を解釈します。{$calc:'xxx'}は結合則付きの四則演算され展開されます。Dateインスタンスに対する加減算も実行されます |
#CURがデフォルトでレコード全体を表しており、マッピング定義を省略しても#CURは設定されます。#CUR.フィールド名でフィールドのオブジェクトにアクセスできます。
import hi.db.hiMongo; import java.io.*; public class Test { static PrintStream ps=System.out; public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); db.in("coll_01") .find("{}","{_id:0}") .forOne("{#tp:type,#va:value}",Fi->{ ps.println("--- get"); ps.println("#CUR "+Fi.get("#CUR").getClass().getName()+" "+Fi.get("#CUR")); ps.println("#tp "+Fi.get("#tp").getClass().getName()+" "+Fi.get("#tp")); ps.println("#va "+Fi.get("#va").getClass().getName()+" "+Fi.get("#va")); ps.println("#CUR.type "+Fi.get("#CUR.type").getClass().getName()+" " +Fi.get("#CUR.type")); ps.println("#CUR.date "+Fi.get("#CUR.date").getClass().getName()+" " +Fi.get("#CUR.date")); ps.println("--- disp"); ps.println(Fi.disp("CUR=#CUR")); ps.println(Fi.disp("tp=#tp va=#va CUR.type=#CUR.type CUR.date=#CUR.date")); ps.println("--- eval"); ps.println("{$gt:{$calc:'#CUR.date+17000}'}}->" +Fi.mson(Fi.eval("{$gt:{$calc:'#CUR.date+17000'}}"))); }) ; } } *** 実行結果 ---- 17forOneValue ----- -- get CUR org.bson.Document Document{{type=A, value=12.3, date=Mon Aug 17 16:07:00 JST 2020}} tp java.lang.String A va java.lang.Double 12.3 CUR.type java.lang.String A CUR.date java.util.Date Mon Aug 17 16:07:00 JST 2020 -- disp UR={'type':'A', 'value':12.3, 'date':ISODate('2020-08-17T07:07:00.000Z')} p=A va=12.3 CUR.type=A CUR.date=ISODate('2020-08-17T07:07:00.000Z') -- eval $gt:{$calc:'#CUR.date+17000}'}}->{'$gt':ISODate('2020-08-17T07:07:17.000Z')}
elal()
の引数はJSON形式でなければなりません。{$calc:'数式'}は演算結果に置き換わります。数式は結合則付きの四則と括弧がサポートされます。
Date
クラスへの数値の加算減算機能も持ちます。
eval()
は通常find()
などの引数に内部的に適用されており、通常利用者が使う場面は多く有りません。
検索結果をDBスコープ変数(#変数)に取り込む
readOne()
を用いればDBから読み込んだ値をDBスコープの変数に取り込むことができます。
指定は{#変数名:フィールド名}で{}内に複数並べることが出来ます。
limit(1)
が補助的に発行されます。
次の例では最終レコードのdateを#last_dateとして取り込み、#last_dateより25秒前からのレコードを取得しています。
{$calc:'#last_date-25000'}はDate演算を行った結果に置き換わります。
import hi.db.hiMongo; public class Test { public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); db.in("coll_01") .find() .sort("{_id:-1}") .readOne("{#last_date:'date'}") .find("{date:{$gte:{$calc:'#last_date-25000'}}}","{_id:0}") .forEachMson(Rm->System.out.println(Rm)) ; } } *** DB内容 {type:'A',value:12.3,date:ISODate('2020-08-17T07:07:00.000Z')} ,{type:'A',value:4.56,date:ISODate('2020-08-17T07:07:10.000Z')} ,{type:'B',value:2001,date:ISODate('2020-08-17T07:07:20.000Z')} ,{type:'A',value:7.89,date:ISODate('2020-08-17T07:07:30.000Z')} ,{type:'A',value:0.12,date:ISODate('2020-08-17T07:07:40.000Z')} *** 実行結果 ----- 18readOneSimple ----- {'type':'B', 'value':2001, 'date':ISODate('2020-08-17T07:07:20.000Z')} {'type':'A', 'value':7.89, 'date':ISODate('2020-08-17T07:07:30.000Z')} {'type':'A', 'value':0.12, 'date':ISODate('2020-08-17T07:07:40.000Z')}top、API
再帰探索と変数
forEachRecursive()
,forOneRecursive()
で指定リンクをたどる再帰アクセスが出来ます。
リンクは
{#CUR.リンク情報フィールド名:リンク先のidフィールド名}の形で指定します。{}内に複数並べることが出来ます。
ラムダ式は3つです。それぞれ参照可能な変数があります。
2番目のラムダ式と3番目のラムダ式は省略可能です。
次の例では各レコードはnameで識別され、father、motherで参照されます。
{'name':'P0009', 'status':'-', 'father':'P0001', 'mother':'P0002'}
指定されたレコードからfather、motherを再帰的に遡りstatusがKINGであるレコードにたどり着くかを調べています。
import hi.db.hiMongo;
public class Test {
public static void main(String[] args_){
hiMongo.DB db=hiMongo.use("db01");
db.in("famiryTree")
.find("{name:{$in:['P0027','P0028','P0029','P0030','P0031']}}")
.forEachRecursive(
"{#CUR.father:name,#CUR.mother:name}" // リンク
,Fr->{ // 主処理(再帰呼び出しされる)
if( "KING".equals(Fr.get("#CUR.status")) ) {
return Fr.disp(" is a descendant of KING #CUR.name");
}
return null;
}
,Ff->{ // 完了 #RESULT に主処理の戻り値
System.out.println(Ff.disp("#TOP.name")+Ff.disp("#RESULT")+".");
}
,Fn->{ // 完了
System.out.println(Fn.disp("#TOP.name is not."));
}
)
;
}
}
*** 実行結果
----- 13recursive -----
P0027 is not.
P0028 is a descendant of KING P0003.
P0029 is not.
P0030 is a descendant of KING P0003.
P0031 is not.
試験に使用したDBデータを示します。
取得するフィールドの指定#FIELD
#FIELDを指定することにより、読み込むレコードのフィールド指定(find()
の第二引数}ができます。
db.in("famiryTree") .find("{name:{$in:['P0027','P0028','P0029','P0030','P0031']}}","{_id:0}") .forEachRecursive( .forEachRecursive( "{#CUR.father:name,#CUR.mother:name,#FIELD:{_id:0}}" ,Fr->{...
なお、入り口レコードのフィールド指定は再帰の外側での指定となります。
フィルターの指定#FILER
#FILTERを指定することにより、find()
のフィルターを直接指定できます。
db.in("famiryTree")
.find("{name:{$in:['P0027','P0028','P0029','P0030','P0031']}}")
.forEachRecursive(
.forEachRecursive(
"{#FILTER:{name:{$in:[#CUR.father,#CUR.mother]}},#FIELD:{_id:0}}"
,Fr->{...
この例で#FILTERの内容にある#CURはキーワードではなく変数の参照です。
find()
発行時に変数が展開されます。
その他の変数も同様に参照可能です。
特別変数the_value
DBスコープの特別な変数が用意されています。
これは#参照による展開はできません。
set_the_value(Object)
とget_the_value()
でセット/ゲットできます。
次の例ではforOne(...)
の中でgetClassList()
により結果を得ていますが、forOneの戻り値はFinder
なのでgetClassList()の戻り値を直接戻すことができません。
そのためforOne(...)の中でset_the_value()で特別変数the_valueにセットし、その後戻り値としてget_the_value()で値を取り出しています。
なおget_the_valueの引数はget_the_valueの返すべき型を示すと同時にデフォルト値であり、'the_value'がnullまたはcast不能の場合引数値が戻ります。
import hi.db.hiMongo; import java.util.*; public class Test { static class Record { // レコード内容 String type; double value; Date date; } public static void main(String[] args_){ hiMongo.DB db=hiMongo.use("db01"); ArrayList<Record> _recs =db.in("coll_01") .find("{}","{_id:0}") .sort("{_id:-1}") .forOne("{#last_date:'date'}",Fi->{ Fi.set_the_value( Fi.find("{date:{$gte:{$calc:'#last_date-25000'}}}","{_id:0}") .getClassList(Record.class)); }) .get_the_value(new ArrayList<Record>()); for(Record _rec:_recs){ System.out.println(_rec.type+"/"+_rec.value+"/"+_rec.date); } } } *** 結果 ----- 20the_value ----- B/2001.0/Mon Aug 17 16:07:20 JST 2020 A/7.89/Mon Aug 17 16:07:30 JST 2020 A/0.12/Mon Aug 17 16:07:40 JST 2020top、API
insert等のレコード処理
コレクション内のレコードの操作として追加(insert)、削除(delete)、更新(update)、置き換え(replace)、コレクションごと全削除(drop)が用意されています。
レコードインサートには利用者クラスを使う事もできます。
insert
insertOne()
の引数は1レコードの拡張JSON形式で、insertMany()
の引数は拡張JSONのList型です。
それらを記述したテキストファイル、あるいはそれらの解析されたノードツリーも許されます。
条件文は付きません。
次の様な使い方になります。in("コレクション")
はその時点で存在しないコレクションに対して行っても構いません。なおhiMongo.date()
は現在時の標準JSON表現を得る関数です。
hiMongo.DB db =hiMongo.use("db01"); db.in("coll_01") .insertOne( " {type:'A',value:12.3,date:"+hiMongo.date()+"}");
drop
drop()
はレコードの削除のみならずコレクションそのものの削除ですが、insertOne()
,insertMany()
を繋げると、元の名前のコレクションが再び作成され空の状態でのレコード追加となります。
hiMongo.DB db =hiMongo.use("db01"); db.in("coll_01") .drop() .insertMany("["+ " {type:'A',value:4.56,date:"+hiMongo.date()+"}"+ ",{type:'B',value:2001,date:"+hiMongo.date()+"}"+ ",{type:'A',value:7.89,date:"+hiMongo.date()+"}"+ ",{type:'A',value:0.12,date:"+hiMongo.date()+"}]");
delete
deleteOne()
では登録の古いレコードが検索され、合致した一個のみが削除されます。
deleteMany()
では合致するレコードが全て削除されます。
hiMongo.DB db =hiMongo.use("db01"); hiMongo.Collection _coll=db.in("coll_01"); // --- deleteOne _coll.deleteOne("{type:'B'}"); // --- deleteMany _coll.deleteMany("{$and:[{type:'A'},{value:{$lt:8}}]}");
update
updateOne()
,updateMany()
は{$set:{フィールド名:値}}でフィールドの値の変更を指定します。
複数フィールドの置き換えはフィールド名の値のセットをカンマで繋ぎます{$set:{フィールド1:値1,フィールド2:値2,...}
存在しないフィールド名を指定するとフィールドの追加となります。
単純な値の置き換えを行う$setの他に値の増減を行う$incなども用意されています。
(更新の演算子参照)
$setによる単純置き換え例(この例では3に置き換えている)
---- before $set {'type':'C', 'name':'X', 'value':5} {'type':'C', 'name':'Y', 'value':10} {'type':'C', 'name':'X', 'value':13} ---- program .updateMany("{$and:[{type:'C'},{name:'X'}]}", "{$set:{value:3}}") ---- after $set {'type':'C', 'name':'X', 'value':3} {'type':'C', 'name':'Y', 'value':10} {'type':'C', 'name':'X', 'value':3}
$incによる増減例(この例では+3している)
---- before $inc {'type':'C', 'name':'X', 'value':5} {'type':'C', 'name':'Y', 'value':10} {'type':'C', 'name':'X', 'value':13} ---- program .updateMany("{$and:[{type:'C'},{name:'X'}]}", "{$inc:{value:3}}") ---- after $inc {'type':'C', 'name':'X', 'value':8} {'type':'C', 'name':'Y', 'value':10} {'type':'C', 'name':'X', 'value':16}
条件に合致するレコードが無い場合は無処理です。
指定フィールドが存在ない場合、フィールドが追加されてしまうことに注意が必要です。
指定フィールドが存在する場合のみupdateするには$existを用います。
final String _field_name="value"; hiMongo.DB db=hiMongo.use("db01"); db.in("coll_01") .updateMany("{$and:[{type:'C'},{name:'X'},{"+_field_name+":{$exists:true }}]}", "{$set:{"+_field_name+":3}}");
replace
replaceOne()
はレコード全体の置き換えになります。
条件とレコード全体が引数となります。replaceMany()は有りません。
// --- replaceOne _coll.replaceOne("{$and:[{type:'A'},{value:{$lt:5}}]}", "{type:'B',value:6543,date:"+hiMongo.date()+"}");
利用者定義クラス・インスタンスをinsertする
レコード情報を持つ利用者のクラス・インスタンスをinsertOne()
を用いてinsertすることが出来ます。
class MyRecord { // レコード内容 String type; double value; Date date; } ----- hiMongo.DB db = hiMongo.use("db01"); MyReord _rec= new MyRecord(); _rec.type = "D"; _rec.value= 12.3; _rec.date = new Date(); db.in("coll_01") .insertOne(_rec);
ListにすればinsertMeny()
も可能です。
利用者クラスはinsert以外でも拡張JSON文字列の代わりに与えることができます。
top、APIcap指定(最大容量)、index設定
キャップ(最大容量)指定
hiMongo.DB
のcreateCappedCollection()
メソッドで、容量制限付きのコレクションを作成できます。
既にあるコレクションの容量を変更することは出来ません。
insertOne(),insertMany()を発行した場合、制限容量に達すると、古いレコードが削除されます。
createCappedCollection()にはコレクション名と、容量情報を指定します。
容量情報はJSON形式の文字列で次の形となります。
{ size :バイト数, records:レコード数, force :trueまたはfalse } EX {size:1000000000,records:5000,force:true}
forceがtrueだと必ず要素無しでcap指定のされたのコレクションを作成します。
forceがfalseの場合すでにコレクションがあれば無処理となります。
インデックス指定,ユニーク性保証,生存時間制限
hiMongo.Collection
のcreateIndex()
を用いてインデックスを作成することにより検索の速度を上げることができます。
インデックスには値のユニーク性の保証(unique)、レコード生存時間の限定(expireAfter)などのオプションを付加することが出来ます。
次の例ではindexを作成する前と、'商品id'フィールドでindexを作成した後のインデックスのリストを出しています。
hiMongo.DB db=hiMongo.use("sampleDB"); System.out.println("--- befor creteIndex"); db.in("商品").getIndexList().forEach(Do->System.out.println(Do)); db.in("商品").createIndex("{商品id:1}","{unique:true}"); db.in("商品").createIndex("{商品id:1}","{unique:true,expireAfterDays:730}"); System.out.println("--- after creteIndex"); db.in("商品").getIndexList().forEach(Do->System.out.println(Do)); @@@出力 --- befor creteIndex Document{{v=2, key=Document{{_id=1}}, name=_id_, ns=sampleDB.商品}} --- after creteIndex Document{{v=2, key=Document{{_id=1}}, name=_id_, ns=sampleDB.商品}} Document{{v=2, unique=true, key=Document{{商品id=1}}, name=商品id_1 , ns=sampleDB.商品, expireAfterSeconds=63072000}}
フルコードは「aggregate(集計)lookupによるフィールド結合」にあります。
top、APIaggregate(集計)
aggregate()
を用いれば集計を得ることができます。
結果の取得はfind()
と同様で次のものが用意されています。
Documentで受け取る | getDocumentList() リストで受けるforEachDocument(Documentを引数とするラムダ式) |
利用者クラスインタンスで受け取る | getClassList(Class) リストで受けるforEachClass(Class,利用者クラスインスタンスを引数とするラムダ式) |
ノード探査機で受け取る | getProbeList() リストで受けるforEachProbe(Probeを引数とするラムダ式) |
JSON文字列で受け取る | getJsonList() リストで受けるforEachJson(Json文字列を引数とするラムダ式) |
拡張JSON文字列MSONで受け取る | getMsonList() リストで受けるforEachJson(Mson文字列を引数とするラムダ式) |
単純集計($match,$group)
$mactchと$groupで単純集計を得ることが出来ます。
class Arec { String _id; double min; double max; double avg; } ---- double _start_date=取得開始レコードのunixエポック Arec _r =db.in("coll_01") .aggregate("["+ "{ $match:{$and:["+ "{type:'A'},"+ "{date:{$gte:{$date:"+_start_date+"}}}"+ "]}},"+ "{ $group:{"+ "_id:'$type',"+ "min:{$min:'$value'},"+ "max:{$max:'$value'},"+ "avg:{$avg:'$value'}}}"+ "]") .getClassList(Arec.class).get(0); System.out.printf("min=%.2f max=%.2f avg=%.2f" ,_r.min,_r.max,_r.avg));
これは次のmongo-shell記述に相当します。
var _isodate=new Date(取得開始レコードのunixエポック) var _r= db.coll_01. aggregate([ { $match:{$and:[ {type:'A'}, {date:{$gte:_isodate}} ]}}, { $group:{_id:"$type", min:{$min:"$value"}, max:{$max:"$value"}, avg:{$avg:"$value"}}} ]). toArray()[0]; print("min="+_r.min+" max="+_r.max+" avg="+_r.avg.toFixed(2));
#変数の参照
aggregateでも#変数参照ができます。
次の例ではreadOneで取り込んだ値を使ってaggregateを実行しています。
$lookupによるフィールド結合
$lookupを用いれば異なるコレクションのレコード・フィールドを結合することができます。
結合されたデータは利用者定義の型のリストで受け取ることができます。
class A_Rec {
String 店舗名;
int 数量;
from商品_Rec from商品;
static class from商品_Rec{
String 商品名;
int 販売単価;
}
}
---
ArrayList<A_Rec> _recs
=db.in("店舗商品")
.aggregate("["+
"{$match:{$or:["+
"{'店舗名':'東京'},"+
"{'店舗名':'福岡'}"+
"]}},"+
"{$lookup:{"+
"from:'商品',"+
"localField:'商品id',"+
"foreignField:'商品id',"+
"as:'from商品'"+
"}},"+
"{$project:{"+
"'_id':0,"+
"'店舗名':1,"+
"'from商品.商品名':1,"+
"'from商品.販売単価':1,"+
"'数量':1}},"+
"{$unwind:'$from商品'}"+
"]")
.getClassList(A_Rec.class);
for(A_rec _rec:_recs){
System.out.println(_rec.店舗名+" "+_rec.from商品.商品名
+" 数量:"+_rec.数量);
}
mongo-shellの次の記述に相当します。
use sampleDB db.店舗商品. aggregate([ {$match:{$or:[ {'店舗名':'東京'}, {'店舗名':'福岡'} ]}}, {$lookup:{ from:'商品', localField:'商品id', foreignField:'商品id', as:'from商品' }}, {$project:{ '_id':0, '店舗名':1, 'from商品.商品名':1, 'from商品.販売単価':1, '数量':1}}, {$unwind:'$from商品'} ]);
mongoDB拡張JSON(mson)記述
hiMongoはmongoDBの拡張JSON記述のパーザ、表記生成器の機能も持ちます。
パーズ結果は汎用オブジェクト(nodeツリー)または利用者クラスになります。
汎用オブジェクトレベルではmongoDBのDocument
と内部形式のほぼ互換性を保っています。
引用符
英文字あるいは$で始まり英数字が続くフィールド名は引用符の省略が可能です。
引用符はダブルクオート、シングルクオート何れも可能です。
db.in("XX").find("{\"name\":\"A\"}")// 標準 db.in("XX").find("{name:\"A\"}")// 通常フィールド名引用符省略可 db.in("XX").find("{name:'A'}")// シングルクオート可
出力はmsonではシングルクオート、jsonはダブルクオートとしています。
ObjectId,Dateと数値
mongo拡張JSON(mson:bsonパーザ)で気を付ける必要があるのが、ObjectId
とDate
および数値です。
これらは次の表現形を持ちます。
型 | bson(内部値) | mson表現 | json表現 | stringify表現 |
ObjectId |
ObjectId |
ObjectId("...") | {$oid:"..."} | {$oid:"..."} |
Date |
Date |
ISODate("...") shell入力:new Date(unixEpoch) |
{$date:unixEpoch} | "..." 入力不可 |
int | Integer | NumberInt("...") | {$numberInt:数値} | 数値 |
long | Long | NumberLong("...") | {$numberLong:数値} | 数値 |
double | Double | 数値 | 数値 | 数値 |
BigDecimal |
Decimal128 |
NumberDecimal("...") 数値入力不可 |
{$numberDecimal:"..."} 数値入力不可 |
数値 入力不可 |
mongo-shellでは{...}系の入力はできません。指定名("$date"など)要素を持つ構造になってしまいます。
Document
パーザは19桁を超える数値を扱えません。NumberDecimal(..)または{$numberDecimal:..}を使う必要があります。
hiMongoでは次の扱いとなります。
型 | Object(内部値) | mson表現 | json表現 |
ObjectId |
ObjectId |
ObjectId("...") | {$oid:"..."} |
Date |
Date |
ISODate("...") | {$date:unixEpoch} |
int | Long | 数値 NumberInt("...")可 |
数値 {$numberInt:数値}入力可 |
long | Long | 数値 NumberLong("...")可 |
数値 {$numberLong:数値}入力可 |
double | Double | 数値 | 数値 |
BigDecimal |
BigDecimal |
NumberDecimal("...") 数値入力可 |
数値 |
hiMongoのパーザには桁数制限は有りません。hiMongoのパーズでは17桁までの整数はLong、仮数15桁まで指数15以下浮動小数はDouble、それ以外はBigDecimal
となります。BigDecimal
はbsonになる時点でDecimal128
となります。
Document
内部データはDocument
特有のクラスがありhiMongo内部データのJava標準のクラスとは異なりますが互いに変換可能です。
利用者クラスにマッピングする場合、数値はどの形でも利用者クラスの要素型になります。ただし、桁あふれは無視されます。
コメント等のhiMongo拡張(hson)
標準ではmson記述はコメントを受け付けません。
hiMongo
hiMongo.parseXX(...).asNode()を用いて汎用Objectノードツリー化すればコメントの記述も可能です。
また、hiMongo.parseXX(...).asNodeList()を用いれば複数レコードがただ並ぶだけでJSONの配列形式を採らない記述も受け付けinserManyなどの引数に出来ます。
例えば次の記述をinsertManyに与えることが出来ます。
// 作曲家リスト // 出生国と異なる国に移住し活躍した場合はnationalityに // 出生国,移住国の順で記述 // ご存命の場合はlifeTimeに出生年のみ記述 {famiryName:'Bach',givenName:['Johann','Sebastian'], nationality:['独'],lifeTime:[1685,1750]} {famiryName:'Bartók',givenName:['Béla'], nationality:['ハンガリー','米'],lifeTime:[1881,1945]} {famiryName:'Beethoven',givenName:['Ludwig','van'], nationality:['独'],lifeTime:[1770,1827]} {famiryName:'Brahms',givenName:['Johannes'], nationality:['独'],lifeTime:[1833,1897]} {famiryName:'Chopin',givenName:['Frédéric-Françoic'], nationality:['ポーランド','仏'],lifeTime:[1810,1849]}
プログラムの断片を示します。
with_hson()指定をすれば、hson拡張文字列を取り扱えます。
//-- with_hson()を発行した上で文字列を直接与える方法 String _records_json=hiFile.readTextAll("data.json"); hiMongo.DB db=hiMongo.use("db01"); db.in("composer").drop() .with_hson() .insertMany(_records_json);
ファイル入力の場合Stringに落とすことなくFileを直接指定することも可能です。
//-- with_hson()を発行した上でFile指定 hiMongo.DB db=hiMongo.use("db01"); db.in("composer").drop() .with_hson() .insertMany(new File("data.json"));
with_hson()指定を行わず、一旦hiMongo.parseText().adNodeList()でノードレベルまで解析した結果を与えることも出来ます。
//-- パーズ結果を使う方法 String _records_json=hiFile.readTextAll("data.json"); Object _recodes_node=hiMongo.parseText(_records_json) .asNodeList(); hiMongo.DB db=hiMongo.use("db01"); db.in("composer").drop() .insertMany(_recodes_node);top、API
remote接続
リモートホストに置かれたデータベースアクセスすることができます。
リモート側(サーバ側)設定
外部からのアクセスを許すhost設定
リモート側ではmongodb設定でbind_ipにアクセスを許可するhostを指定する必要があります。
設定ファイル /etc/mongodb.conf 設定内容 #bind_ip = 127.0.0.1 # コメントアウト bind_ip = 0.0.0.0 # 追加
0.0.0.0は全てのホストを許可する指定です。セキュリティを考慮すると、個別hostを記述したほうがよいでしょう。 なおmongoDBのバージョンにより記述法に差があるようです。
外部からのアクセスを許すユーザ設定
アクセスを許すユーザの設定をmongo-shellを使って設定します。
例を示します。ここで指定するDBは利用者設定DBであり、利用者がデータ用に用いるDBとは別です。
$ mongo > use testDB; > db.createUser({ user:'testUser', pwd:'xxx', roles:[ {role:'dbOwner',db:'testDB'} ] }); > exit;
クライアント側アクセス
mongo-shellでアクセス
次のような形でサーバとは別のPCからmongo-shellアクセスができます。
$ mongo -u testUser -p xxx --host 192.168.1.139 testDB >
hiMongoによるJavaプログラムアクセス
use()の前にconnect()メソッドにJSON文字列またはhiMongo.RemoteInfoで接続先の情報を指定します。
//---- JSON文字列で情報を与える hiMongo.DB db=hiMongo.connect("{"+ "host:'192.168.1.139',"+ "port:27017,"+ "dbName:'testDB',"+ "user:'testUser',"+ "password:'xxx'"+ "}") .use("db01");// 利用者が使うDBはdb01 db.in("coll_01").find()...
または
//---- クラス(hiMongo.RemoteInfo)で情報を与える hiMongo.RemoteInfo _info=new hiMongo.RemoteInfo(); _info.host = "192.168.1.139"; _info.port = 27017; _info.dbName = "testDB"; _info.user = "testUser"; _info.password= "xxx"; hiMongo.DB db=hiMongo.connect(_info) .use("db01");// 利用者が使うDBはdb01 db.in("coll_01").find()...top、API
Caller(API)とWorker(deiver呼び出し)
hiMongo.Client
~hiMongo.Finder
はinterfaceとなっています。
2種の実装が用意されています。
直接driverを呼ぶ実装はhiMongoDirect
でhiMongoDirect.Client
~hiMongoDirect.Finder
の実装を持っています。
APIを受け持つ部分(Caller)実装はhiMongoCaller
でhiMongoCaller.Client
~hiMongoCaller.Finder
の実装を持っています。
通信機はhiStringCOM
の実装となります。
driverを呼ぶ部分(Worker)実装はhiMongoWorker
で通信機hiStringCOM
の実装ともなっています。
hiMongo.Client
,hiMongo.DB
はhiMongo.connect(),hiMongo.use()で作成されます。
この際引数にhiStringCOM
があると、hiMongoCaller
が生成され、なければhiMongoDirect
が生成されます。
通信機を指定しない場合、mongo-java-driverを直接呼ぶ形となります。
hiMongo.DB db=hiMongo.use("db01"); // hiMongoDirect
となる
db.in("coll_01")
.find("{}","{_id:0}")
...
通信機を指定するとCallerが生成され、mongo-java-driverは通信機の先にあるworkerが呼び出します。
次の例ではサンプルとして用意されている通信機hiMonWorkerSample.COM
を利用しています。
WorkerはhiMonWorkerSample
のWorkerSampleプログラムがサーバとして動いているものとしています。
hiStringCOM COM=new hiMonWorkerSample.COM("192.168.1.14",8010); // 通信機
hiMongo.DB db=hiMongo.use("db01",COM); // hiMongoCaller
となる
db.in("coll_01")
.find("{}","{_id:0}")
...
なおhiMongoWorker
も通信機hiStringCOM
の実装なので次の様に動かすことも出来ます。
hiMongoWorker _worker=new hiMongoWorker();
hiMongo.DB db=hiMongo.use("db01",_walker); // hiMongoCaller
となる
db.in("coll_01")
.find("{}","{_id:0}")
...
最も単純な通信機はCallerとWorkerを繋ぐだけのものとして実装できます。
public class SimpleRepeater implements hiStringCOM{ hiStringCOM to; public Repeater(hiStringCOM to_){ to= to_; } @Overrride public String call(String msg_){ return to.call(_msg); } } //----- hiMongoWorker _worker = new hiMongoWorker(); SimpleRepeater _repeater= new SimpleRepeater(_worker); hiMongo.DB db=hiMongo.use("db01",_repeater); db.in("coll_01") .find("{}","{_id:0}") ...
Andoridで利用するサンプル
アンドロイドで利用するサンプルをgitHUBで公開しています。
https://github.com/hiuric/AndroMongo
top、APIbuild
log他
更新履歴
0.05
公開初版
0.06
0.07
0.08
以下はhiMongo本体の変更ではありませんが、サンプルを含むリリースセットの変更としてここに載せます。
0.10 Caller/Worker分離。Android対応
hiMongo-APIとdriver呼び出し部を分離し仮想通信機で結ぶことにより、Androidにアプリを置きWindows/LinuxにDBを置く形を可能とした。
0.11 辞書変数と再帰探索導入
API
修飾子とタイプ | クラスと説明 |
---|---|
static interface |
hiMongo.Accessor
レコードアクセス機(Finder,Aggregatorのベース).
|
static interface |
hiMongo.Aggregator
集計器.
|
static interface |
hiMongo.Client
mongoDBサーバとの接続を表す.
|
static interface |
hiMongo.Collection
collectionを表す.
|
static interface |
hiMongo.DB
database.
|
static interface |
hiMongo.Finder
DB内レコード範囲設定、リスト取得機構.
|
static interface |
hiMongo.MoreMongo
動的connect/use実行機.
|
static class |
hiMongo.RemoteInfo
接続先情報(connect引数).
|
修飾子とタイプ | フィールドと説明 |
---|---|
static long |
USE_JSON
json文字列を使う
|
static long |
USE_str
objectの表示にhiU.strを使う
|
修飾子とタイプ | メソッドと説明 |
---|---|
static hiMongo.Client |
connect()
mongo-driver直呼びの接続を得る.
|
static hiMongo.Client |
connect(hiStringCOM comm_)
指定通信機を使うCallerによるClientを得る
|
static hiMongo.Client |
connect(Object remote_)
mongo-driver直呼びの接続を得る.
|
static hiMongo.Client |
connect(Object remote_,
hiStringCOM comm_)
指定通信機を使うCallerによるClientを得る
|
static String |
date()
現在時刻の拡張JSON表記を得る.
|
static hiJSON.Engine |
engine()
拡張JSON(MSON)解析/表示エンジン取得.
|
static hiJSON.Engine |
engineJ()
標準JSON表示エンジン取得.
|
static hiMongo.RemoteInfo |
getRemoteInfo(Object remote_) |
static String |
json(Object obj_)
標準JSON表記を得る.
|
static String |
json(Object obj_,
long option_)
標準JSON表記を得る.
|
static String |
mson(Object obj_)
mongo拡張JSON表記を得る.
|
static String |
mson(Object obj_,
long option_)
mongo拡張JSON表記を得る.
|
static Document |
namedObjToDoc(String name_,
Object data_)
StringまたはMapオブジェクトから作成されるDocumentを指定名の要素として持つDocumentを得る.
|
static void |
nolog()
mongo-java-driverのログを止める(未).
|
static void |
nolog(Class<?> class_)
mongo-java-driverのログを止める(未).
|
static Bson |
objToBson(Object obj_)
オブジェクトからBsonを得る.
|
static hiJSON.Engine |
parse(File textFile_)
パーズするFileを指定.
|
static hiJSON.Engine |
parse(String text_)
パーズするテキストを指定.
|
static hiJSON.Engine |
parseFile(String fileName_)
パーズするテキストファイルをファイル名で指定.
|
static hiJSON.Engine |
parseNode(Object obj_)
パーズするノードツリーObjectを指定.
|
static hiJSON.Engine |
parseText(String text_)
パーズするテキストを指定.
|
static ArrayList<String> |
show_dbs(boolean sort_)
mongo-driver直呼び,デフォルト接続でDatabase名一覧を得る.
|
static Document |
sObjToDoc(Object obj_)
StringまたはオブジェクトからDocumentを得る.
|
static String |
str(Object obj_)
データ構造表示.
|
static String |
str(Object obj_,
long option_)
データ構造表示.
|
static String |
suprress_dot_0(String str_)
数値文字列から.0を削除する.
|
static hiMongo.DB |
use(String dbName_)
mongo-driver直呼び,デフォルト接続のDBを得る.
|
static hiMongo.DB |
use(String dbName_,
hiStringCOM comm_)
指定通信機を使うCallerによるDBを得る
|
public static final long USE_JSON
public static final long USE_str
public static hiMongo.Client connect()
public static hiMongo.Client connect(Object remote_)
remote_
- 接続情報public static hiMongo.DB use(String dbName_)
dbName_
- Database名public static hiMongo.Client connect(hiStringCOM comm_)
comm_
- 通信機public static hiMongo.Client connect(Object remote_, hiStringCOM comm_)
remote_
- リモートDB情報comm_
- 通信機public static hiMongo.DB use(String dbName_, hiStringCOM comm_)
dbName_
- Database名comm_
- 通信機public static ArrayList<String> show_dbs(boolean sort_)
sort_
- ソート指定public static hiMongo.RemoteInfo getRemoteInfo(Object remote_)
public static final void nolog()
public static void nolog(Class<?> class_)
class_
- クラス(mainのクラス)
public static hiJSON.Engine parseText(String text_)
本メソッドの後ろにパーズ形式を指定することでパーズが実行されます。
String _json_text="...."; MyClass _data= hiMongo.parseText(_json_text).asClass(MyClass.class);
Document
を得るには次のようにします。
String _json_text="...."; Document _doc= new Document(hiMongo.parseText(_json_text).asMap());
text_
- テキストpublic static hiJSON.Engine parse(String text_)
本メソッドの後ろにパーズ形式を指定することでパーズが実行されます。
Document
を得るには次のようにします。
String _json_text="...."; Document _doc= new Document(hiMongo.parse(_json_text).asMap());
text_
- テキストpublic static hiJSON.Engine parse(File textFile_)
本メソッドの後ろにパーズ形式を指定することでパーズが実行されます。
Document
を得るには次のようにします。
File _file= new file("./data.json"); Document _doc = new Document(hiMongo.parse(_file).asMap());
textFile_
- テキストファイルpublic static hiJSON.Engine parseNode(Object obj_)
本メソッドの後ろにパーズ形式を指定することでパーズが実行されます。
他のツール(org.bson.Documentなど)で解析された結果のObjectもパーズできます。
String _json_text="...."; Document _doc = Document.parse(_json_text); MyClass _data= hiMongo.parseNode(_doc).asClass(MyClass.class);
obj_
- ノードツリーObjectpublic static hiJSON.Engine parseFile(String fileName_)
本メソッドの後ろにパーズ形式を指定することでパーズが実行されます。
String _json_file="./data.json"; MyClass _data= hiMongo.parseFile(_json_file).asClass(MyClass.class);
Document
を得るには次のようにします。
String _json_file="./data.json"; Document _doc = new Document(hiMongo.parseFile(_file).asMap());
fileName_
- テキストファイル名public static String str(Object obj_)
データ構造表示をします。JSON形式ではありません。
obj_
- nodeオブジェクトpublic static String str(Object obj_, long option_)
データ構造表示をします。JSON形式ではありません。
obj_
- nodeオブジェクトoption_
- 表示オプション (hiU.WITH_INDENTなどhiFieldFormatオプション
参照)public static String mson(Object obj_)
nodeツリー上にObjectID,Dateクラスインスタンスが有る場合ObjectId(),ISODate()の形で表示します。
obj_
- nodeオブジェクトpublic static String mson(Object obj_, long option_)
nodeツリー上にObjectID,Dateクラスインスタンスが有る場合ObjectId(),ISODate()の形で表示します。
obj_
- nodeオブジェクトoption_
- 表示オプション (hiU.WITH_INDENTなどhiFieldFormatオプション
参照)public static String json(Object obj_)
nodeツリー上にObjectID,Dateクラスインスタンスが有る場合{"$oid":"..."},{"$date":unixEpoch}で表示されます。
obj_
- nodeオブジェクトpublic static String json(Object obj_, long option_)
nodeツリー上にObjectID,Dateクラスインスタンスが有る場合{"$oid":"..."},{"$date":unixEpoch}で表示されます。
obj_
- nodeオブジェクトoption_
- 表示オプション (hiU.WITH_INDENTなどhiFieldFormatオプション
参照)public static hiJSON.Engine engine()
mongoDB用設定が追加されたJSON解析/MSON表示エンジン(clone)を取得します。
public static hiJSON.Engine engineJ()
標準JSON表示エンジン(clone)を取得します。
public static String date()
次の形式の文字列が得られます。
{$date:Unix-Epoch数値} EX. {$date:1597648051506}
public static String suprress_dot_0(String str_)
double値表示の最後の".0"を削除します。
1234.0 -> 1234 1234.01 -> 1234.01 a50.0 -> a50 a50.01 -> a50.01 a50.0x -> a50x a50.01x -> a50.01x a.0 -> a.0
str_
- 数値文字列を含む文字列public static Bson objToBson(Object obj_)
obj_
- 拡張JSON文字列、File、Documentpublic static Document sObjToDoc(Object obj_)
obj_
- 拡張JSON文字列、File、Document