top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
FireMonkey ベースによる FireDAC を用いた非ビジュアルによる MongoDB アクセス方法をメモします。
利用したコンポーネントは以下です。
TFDConnection
TFDGUIxWaitCursor
TFDPhysMongoDriverLink
TFDMongoQuery
TDataSource
TMemo
TButton
以下のようにコードを記述すると、MongoDB 接続→検索→結果取得→項目のリスト表示 を実現することができます。ビジュアルプログラミングを行うと、これよりずっと少ないコード量で実装できますが、ここではあえて非ビジュアルによるプログラミングにて実装しています。
procedure TForm1.FormShow(Sender: TObject);
begin
/// ///////////////////////////////////////////
// 各種プロパティ設定(通常はコードではなくビジュアル設定します):開始
// ドライバーを MongoDB にセット
FDConnection1.DriverName := 'Mongo';
FDConnection1.LoginPrompt := False;
// 接続先のデータベース情報をセット
FDMongoQuery1.DatabaseName := 'test';
FDMongoQuery1.CollectionName := 'restaurants';
// コンポーネントを関連付け
FDMongoQuery1.Connection := FDConnection1;
DataSource1.DataSet := FDMongoQuery1;
// 各種プロパティ設定(通常はコードではなくビジュアル設定します):終了
/// ///////////////////////////////////////////
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
FDMongoQuery1.Close;
// 検索条件を設定
FDMongoQuery1.QMatch := '{"cuisine": "Italian", "address.zipcode": "10075"}';
FDMongoQuery1.Open;
// 全件取得
FDMongoQuery1.FetchAll;
// 取得結果のヘッダ情報を画面(メモ項目)に表示
Memo1.Lines.Clear;
for i := 0 to DataSource1.DataSet.FieldCount - 1 do
Memo1.Lines.Add(DataSource1.DataSet.FieldDefList.FieldDefs[i].Name);
end;
ネストした項目は、該当項目を取得した上でキャストすることによりアクセスが可能になります。 追加したコンポーネントは以下です。
TDataSource
「// 取得結果のヘッダ情報を画面(メモ項目)に表示」の一連のコードより後に以下のコードを追加すると、ネスト領域にアクセスができます。
// ネストした項目を取得
Memo1.Lines.Add('Nested fields');
// データセットから grades というネスト項目をさらに取り出し。
DataSource2.DataSet := (FDMongoQuery1.FieldByName('grades') as TDataSetField)
.NestedDataSet;
for i := 0 to DataSource2.DataSet.FieldDefList.Count - 1 do
Memo1.Lines.Add(DataSource2.DataSet.FieldDefList.FieldDefs[i].Name);