This article provides a brief overview of the MongoDB data access provider for UniDAC used to establish a connection to MongoDB from Delphi and Lazarus. You will find the description of some useful features and how to get started quickly.
The main features of MongoDB data access provider are:
The full list of MongoDB provider features can be found in Features page.
Both Professional and Standard editions of UniDAC include the MongoDB provider. Express Edition of UniDAC does not include the MongoDB provider.
To learn the supported MongoDB versions and clients, refer to the Compatibility section.
Applications that use the MongoDB provider require libmongoc and libbson client libraries. The MongoDB provider dynamically loads client libraries (for example, libmongoc-1.0.dll and libbson-1.0.dll on Windows) available on user system. To locate DLLs you can set ClientLibrary and BSONLibrary specific options of TUniConnection respectively with paths to client libraries. By default, the MongoDB provider searches for client libraries in the directories specified in the PATH environment variable.
In addition to the standard client libraries, you can use the ones distributed with UniDAC. 32-bit libraries are located in the 'Bin\Win32\' subfolder relative to the folder where UniDAC was installed. 64-bit ones in the 'Bin\Win64\' subfolder. For example:
UniConnection1.SpecificOptions.Values['MongoDB.BSONLibrary'] := 'C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.3\Bin\Win32\libbson-1.0.dll';
UniConnection1.SpecificOptions.Values['MongoDB.ClientLibrary'] := 'C:\Program Files (x86)\Devart\UniDAC for RAD Studio 10.3\Bin\Win32\libmongoc-1.0.dll';
UniConnection1.Connect;
When an application was built without runtime packages (Link with runtime packages set to False in Project Options), you do not need to deploy any BPL files with it. For more information, see Deployment.
Note that UniDAC Trial requires deployment of additional BPL files regardless of Link with runtime packages.
Though UniDAC is a library of components that provide unified interface to work with different database servers, it also lets you tune behaviour for each server individually. For thin setup of a certain database server, UniDAC provides server-specific options. These options can be applied to such components as TUniConnection, TUniQuery and TUniTable via their SpecificOptions property. SpecificOptions is a string list. Therefore you can use the following syntax to assign an option value:
TUniConnection.SpecificOptions.Values['UseUnicode'] := 'True';
Below you will find the description of allowed options grouped by components.
Option name | Description |
---|---|
AdditionalServers | Specifies additional servers to connect to, separated by commas. Each server has to be specified in the host[:port] format as it is described in the official MongoDB documentation. |
BSONLibrary | Use the BSONLibrary option to set or get the libbson client library location. |
ClientLibrary | Use the ClientLibrary option to set or get the libmongoc client library location. |
ConnectionFormat |
The values assigned to this property indicate how the Data Source parameter will be treated. The following values are allowed for this property: cfStandard
When assigned, the Data Source parameter is treated as a connection URI used for connecting to a self-hosted MongoDB standalone deployment, replica set, or sharded cluster.
cfDnsSeedList
When assigned, the Data Source parameter is treated as a support of a DNS-constructed seed list.
The default value is cfStandard.
|
ConnectionOptions | Connection specific options. See official MongoDB documentation for a full description of these options. |
LowerCaseObjectID | Use the option to return ObjectId values in lower case. The default value is False. |
SQLEngine | If set to True, the driver will use the SQL language to access data in a MongoDB database, otherwise it will use the standard Mongo query language. The default value is False. |
UseUnicode | Enables or disables Unicode support. Affects on the character data fetched from the server. When set to True all character data is stored as WideStrings, and TStringField is replaced with TWideStringFiled. |
Option name | Description |
---|---|
AllowAddField | If True, then when editing an existing document, it allows to add new fields to the document. If False, an attempt to add a new field to the document will raise an exceptin. For newly created documents adding new fields is always allowed. The default value is True. |
AllowChangeType | If True, when editing an existing document, it allows to assign a value of another type to the existing document field. If False, an attempt to assign a value of another type will raise an exceptin. For newly created documents changing field type is always allowed. The default value is True. |
ComplexAsString | If True, then complex fields of a document (which are of object, array, timestamp, binary, regular expression or JavaScript type) are mapped as TStringField and their content is displayed in the Extended JSON format. If False, such fields are mapped as TADTField with its child fields. The default value is False. |
DescribeAmount | Specifies the number of sample documents used to create a list of fields in the dataset when DescribeMethod is set to dmGrid. The default value is 25. |
DescribeMethod |
Defines a way of creating dataset fields. The following values are allowed for this property: dmGrid
The field list is generated based on a sample of DescribeAmont documents. The list includes all unique fields from all documents in the sample.
dmObject
The dataset has a single field of the ftADT type, which provides access to the entire document.
The default value is dmGrid.
|
FetchAll | If True, all records of the query are requested from database server when the dataset is being opened. If False, records are retrieved when a data-aware component or a program requests it. The default value is False. |
Note: Since parametrized commands are not supported in MongoDB, the MongoDB provider does not support parameters. Also, update SQL-s are not supported too.
The TUniSQL component has no MongoDB-specific options.
TUniStoredProc, TUniScript, TUniDump, TUniLoader and TUniTransaction components are not supported for the MongoDB provider.
This chapter describes several special cases of using the MongoDB provider.
The MongoDB provider supports the following MongoDB data types:
Since MongoDB is a No-SQL database, the MongoDB provider does not support regular SQL to manage documents. Instead, it supports native MongoDB command syntax to perform CRUD operations:
UniQuery1.SQL.Text := '{"find":"restaurants", "filter":{"cuisine":"italian"}, "sort":{"name:1}}';
UniQuery1.Open;
UniQuery1.SQL.Text := '{"insert":"restaurants", "documents":[{"_id":1, "name":"Volare", "cuisine":"italian"}]}';
UniQuery1.Execute;
UniQuery1.SQL.Text := '{"update":"restaurants", "updates":[{"q":{"name":"Volare"}, "u":{"$set":{"cuisine":"spanish"}}}]}';
UniQuery1.Execute;
UniQuery1.SQL.Text := '{"delete":"restaurants", "deletes":[{"q":{"name":"Volare"}}]}';
UniQuery1.Execute;
To access and modify a document in the code, you can use a special TMongoDocument class that has a set of properties and methods for working with the document structure. The data set always contains at least one field of the ftADT type, which has the same name as the collection and provides access to the entire document using the TMongoDocument class.
uses
...
MongoObjectsUni;
...
var
Document: TMongoDocument;
begin
UniQuery1.Edit;
Document := UniQuery1.GetObject('restaurants') as TMongoDocument;
...
Or, for a newly created document:
uses
...
MongoObjectsUni;
...
var
Document: TMongoDocument;
begin
UniQuery1.Append;
Document := UniQuery1.GetObject('restaurants') as TMongoDocument;
...
ShowMessage(Document.Text);
Document.Text := '{"_id":1, "name":"Volare", "cuisine":"italian"}';
for i := 0 to Document.FieldCount - 1 do
ShowMessage(Document.Fields[i].Name + ': ' + Document.Fields[i].Value);
Also, you can access the particular field of the document via its name using the FieldByName property, for example:
ShowMessage(Document.FieldByName['name'].Value);
or
ShowMessage(Document['name'].Value);
Document
.SetString('name', 'Trattoria');
Note: For the SetJavaScopeCode method, the Scope argument is an array of pairs of identifiers and values, representing the scope.
Document
.SetObject('address')
.SetString('city', 'Chicago')
.SetString('street', 'Dearborn')
.SetInteger('building', 10)
.SetEnd
.SetString('cuisine', 'italian');
The following table lists the constants for mapping MongoDB data types to Delphi data types. See Data Type Mapping for more information.
Constant | Description |
---|---|
mongoString | Maps String to Delphi data types. |
mongoNumber | Maps Number to Delphi data types. |
mongoBoolean | Maps Boolean to Delphi data types. |
mongoObject | Maps Object to Delphi data types. |
mongoArray | Maps Array to Delphi data types. |
mongoNull | Maps Null to Delphi data types. |
mongoObjectId | Maps ObjectId to Delphi data types. |
mongoInt32 | Maps 32-bit integer to Delphi data types. |
mongoInt64 | Maps 64-bit integer to Delphi data types. |
mongoDouble | Maps Double to Delphi data types. |
mongoDateTime | Maps DateTime to Delphi data types. |
mongoTimestamp | Maps Timestamp to Delphi data types. |
mongoUndefined | Maps Undefined to Delphi data types. |
mongoBinary | Maps Binary data to Delphi data types. |
mongoRegex | Maps Regular Expression to Delphi data types. |
mongoJavaspan | Maps Javascript span to Delphi data types. |
mongoJavaScopespan | Maps JavaScript span with scope to Delphi data types. |
mongoMinKey | Maps Min key to Delphi data types. |
mongoMaxKey | Maps Max key to Delphi data types. |
mongoDBPointer | Maps DBPointer to Delphi data types. |
mongoDecimal128 | Maps Decimal128 to Delphi data types. |