h1. MongoDB Translator |
The MongoDB translator provides a relational view to the of data that resides in a MongoDB database. This translator is capable of converting Teiid SQL queries into MongoDB based queries. It supports a full range of SELECT, INSERT, UPDATE and DELETE calls. |
|
MongoDB is a document based "schema-less" database with it own query language, it does not really map perfectly well with relational concepts or SQL query language. In current day enterprise more and more users are using MongoDB kind of NOSQL stores for scalability and performance reasons. For example, applications like storing audit logs, managing web site data is perfectly fine to use database like MongoDB, and do require using a structural databases like Oracle, Postgres ect. MongoDB uses JSON document as its primary storage unit, where it can have additional embedded documents inside the parent document. By using this embedded documents it co-locates the related information that achieves the de-normalization that is hard to achieve in the relational database with out duplication of data or using JOIN between two or more tables. |
MongoDB is a document based "schema-less" database with it own query language - it does not map perfectly with relational concepts or the SQL query language. More and more systems are using a MongoDB kind of NOSQL store for scalability and performance. For example, applications like storing audit logs or managing web site data fits well with MongoDB, and does not require using a structural database like Oracle, Postgres ect. MongoDB uses JSON documents as its primary storage unit, and it can have additional embedded documents inside the parent document. By using embedded documents it co-locates the related information to achieves de-normalization that typically requires either duplicate data or joins to achieve in a relational database. |
|
To make MongoDB work with Teiid, the challenge for MongoDB translator is "How best one can design MongoDB store that can achieve the balance between relational and document based storage?" In our opinion the advantages of "schema-less" design is great at the time of development of an application and not really utilized/useful in many different applications at runtime. "Schema-less" can also be a problem with migrations of application versions and ability to query dynamically and make use of returned information effectively. |
To make MongoDB work with Teiid the challenge for the MongoDB translator is "How best one can design a MongoDB store that can achieve the balance between relational and document based storage?" In our opinion the advantages of "schema-less" design are great at development time. "Schema-less" can also be a problem with migration of application versions and the ability to query and make use of returned information effectively. |
|
MongoDB translator works with above problem and provides some pre-defined solutions in designing the MongoDB storage. Since it is hard and may be impossible in certain situations to derive a schema based on existing the MongoDB collection(s), Teiid approaches the problem in reverse compared to other translators. When working with MongoDB, Teiid requires the user to define the MongoDB schema upfront using Teiid metadata. Since Teiid only allows to define relational schema as its metadata, user needs to define their MongoDB schema in relational terms using tables, procedures, functions. For the purposes of MongoDB, the Teiid metadata has been extended to support few extension properties that can be defined on the table to convert into a MongoDB based document. These extension properties let user define, how a MongoDB document is structured and stored. Based on the relationships (primary-key, foreign-key) defined on table, ONE-to-ONE, ONE-to-MANY, MANY-to-ONE relations between tables mapped such that related information can be embedded along with the parent document for co-location (see de-normalization comment above). Thus achieves the relational schema based design, but document based storage in MongoDB. Currently direct mapping of MANY-to-MANY is not supported. |
Since it is hard and may be impossible in certain situations to derive a schema based on existing the MongoDB collection(s), Teiid approaches the problem in reverse compared to other translators. When working with MongoDB, Teiid requires the user to define the MongoDB schema upfront using Teiid metadata. Since Teiid only allows relational schema as its metadata, the user needs to define their MongoDB schema in relational terms using tables, procedures, and functions. For the purposes of MongoDB, the Teiid metadata has been extended to support extension properties that can be defined on the table to convert it into a MongoDB based document. These extension properties let users define, how a MongoDB document is structured and stored. Based on the relationships (primary-key, foreign-key) defined on a table, and the cardinality (ONE-to-ONE, ONE-to-MANY, MANY-to-ONE) relations between tables are mapped such that related information can be embedded along with the parent document for co-location (see the de-normalization comment above). Thus a relational schema based design, but document based storage in MongoDB. Currently direct mapping of MANY-to-MANY is not supported. |
|
h3. Who are is the primary audience for this translator? |
|
After reading above, it may be that this may not satisfy every user's needs of using the MongoDB. The document structure in MongoDB can be more complex than what Teiid can currently define. We hope this will eventually catch up in future versions of Teiid. This is designed for |
The above may not satisfy every user's needs. The document structure in MongoDB can be more complex than what Teiid can currently define. We hope this will eventually catch up in future versions of Teiid. This is currently designed for: |
1. Users that are using relational databases and would like to move/migrate their data to MongoDB to take advantages scaling and performance with out modifying the end user applications currently running. |
2. Users that are starting out with MongoDB and do not have experience with MongoDB, but are seasoned SQL developers. This provides a low barrier to of entry compared to using MongoDB directly as an application developer. |
3. Integrate other enterprise data sources with MongoDB based data. |
... |
{code} |
Translator does not provide connection to the MongoDB, for that purpose, Teiid has a JCA adapter that provides a connection to MongoDB using MongoDB Java Driver. To define such connector, have a following XML fragment in standalone-teiid.xml. See a example in "<jboss-as>/docs/teiid/datasources/mongodb" |
The translator does not provide a connection to the MongoDB. For that purpose, Teiid has a JCA adapter that provides a connection to MongoDB using the MongoDB Java Driver. To define such connector, use the following XML fragment in standalone-teiid.xml. See a example in "<jboss-as>/docs/teiid/datasources/mongodb" |
{code:lang=XML} |
... |
{code} |
The above defined are the translator and connector, however as mentioned above the MongoDB can NOT derive the metadata based on existing document collections, so user MUST define the metadata. For example, you can define schema using DDL |
The above defines the translator and connector. However as mentioned the MongoDB translator can NOT derive the metadata based on existing document collections - the user MUST define the metadata. For example, you can define a schema using DDL: |
{code:lang=XML} |
... |
{code} |
If carefully see the above schema defined in DDL, there There is only two (2) additional properties that are of specific to MongoDB translator. |
|
* *EMBEDDABLE* - Means that data defined in this table is allowed to be included as an "embeddable" document in a parent document. The parent document is defined by the foreign key relationships. In this situation, Teiid maintains more than one copy of the data in MongoDb store, one in its own collection and also a copy in each of the parent tables that have relationship to this table. |
|
* *EMBEDIN* - Means that data of this table is embeddded-in the defined parent table. There is only a single copy of the data, that is embedded in the parent document. |
Now lets see how these properties behave in different types of relationships on the schema |
... |
* limit |
Apart from SELECT, this translator also supports INSERT, UPDATE and delete. DELETE. |
{warning} |
... |
{tip:title="Native Queries"} |
Native queries are not currently supported. |
{tip} |
The MongoDB translator provides a relational view of data that resides in a MongoDB database. This translator is capable of converting Teiid SQL queries into MongoDB based queries. It supports a full range of SELECT, INSERT, UPDATE and DELETE calls.
MongoDB is a document based "schema-less" database with it own query language - it does not map perfectly with relational concepts or the SQL query language. More and more systems are using a MongoDB kind of NOSQL store for scalability and performance. For example, applications like storing audit logs or managing web site data fits well with MongoDB, and does not require using a structural database like Oracle, Postgres ect. MongoDB uses JSON documents as its primary storage unit, and it can have additional embedded documents inside the parent document. By using embedded documents it co-locates the related information to achieves de-normalization that typically requires either duplicate data or joins to achieve in a relational database.
To make MongoDB work with Teiid the challenge for the MongoDB translator is "How best one can design a MongoDB store that can achieve the balance between relational and document based storage?" In our opinion the advantages of "schema-less" design are great at development time. "Schema-less" can also be a problem with migration of application versions and the ability to query and make use of returned information effectively.
Since it is hard and may be impossible in certain situations to derive a schema based on existing the MongoDB collection(s), Teiid approaches the problem in reverse compared to other translators. When working with MongoDB, Teiid requires the user to define the MongoDB schema upfront using Teiid metadata. Since Teiid only allows relational schema as its metadata, the user needs to define their MongoDB schema in relational terms using tables, procedures, and functions. For the purposes of MongoDB, the Teiid metadata has been extended to support extension properties that can be defined on the table to convert it into a MongoDB based document. These extension properties let users define, how a MongoDB document is structured and stored. Based on the relationships (primary-key, foreign-key) defined on a table, and the cardinality (ONE-to-ONE, ONE-to-MANY, MANY-to-ONE) relations between tables are mapped such that related information can be embedded along with the parent document for co-location (see the de-normalization comment above). Thus a relational schema based design, but document based storage in MongoDB. Currently direct mapping of MANY-to-MANY is not supported.
The above may not satisfy every user's needs. The document structure in MongoDB can be more complex than what Teiid can currently define. We hope this will eventually catch up in future versions of Teiid. This is currently designed for:
1. Users that are using relational databases and would like to move/migrate their data to MongoDB to take advantages scaling and performance with out modifying the end user applications currently running.
2. Users that are starting out with MongoDB and do not have experience with MongoDB, but are seasoned SQL developers. This provides a low barrier of entry compared to using MongoDB directly as an application developer.
3. Integrate other enterprise data sources with MongoDB based data.
The name of the translator to use in vdb.xml is "mongodb".
For example:
<vdb name="nothwind" version="1"> <model name="northwind"> <source name="local" translator-name="mongodb" connection-jndi-name="java:/mongoDS"/> </model> <vdb>
The translator does not provide a connection to the MongoDB. For that purpose, Teiid has a JCA adapter that provides a connection to MongoDB using the MongoDB Java Driver. To define such connector, use the following XML fragment in standalone-teiid.xml. See a example in "<jboss-as>/docs/teiid/datasources/mongodb"
<resource-adapters> <resource-adapter id="webservice"> <module slot="main" id="org.jboss.teiid.resource-adapter.mongodb"/> <transaction-support>NoTransaction</transaction-support> <connection-definitions> <connection-definition class-name="org.teiid.resource.adapter.mongodb.MongoDBManagedConnectionFactory" jndi-name="java:/mongoDS" enabled="true" use-java-context="true" pool-name="teiid-mongodb-ds"> <!-- MongoDB server list (host:port[;host:port...]) --> <config-property name="RemoteServerList">localhost:27017</config-property> <!-- Database Name in the MongoDB --> <config-property name="Database">test</config-property> <!-- Uncomment these properties to supply user name and password <config-property name="Username">user</config-property> <config-property name="Password">user</config-property> --> </connection-definition> </connection-definitions> </resource-adapter> </resource-adapters>
The above defines the translator and connector. However as mentioned the MongoDB translator can NOT derive the metadata based on existing document collections - the user MUST define the metadata. For example, you can define a schema using DDL:
<vdb name="nothwind" version="1"> <model name="northwind"> <source name="local" translator-name="mongodb" connection-jndi-name="java:/mongoDS"/> <metadata type="DDL"><![CDATA[ CREATE FOREIGN TABLE Categories ( CategoryID integer NOT NULL, CategoryName varchar(15), Description varchar(4000), Picture varchar(40), PRIMARY KEY (CategoryID), UNIQUE (CategoryName) ) OPTIONS(UPDATABLE 'TRUE', EMBEDDABLE 'TRUE'); CREATE FOREIGN TABLE Suppliers ( SupplierID integer NOT NULL, CompanyName varchar(40), ContactName varchar(30), ContactTitle varchar(30), Address varchar(60), City varchar(15), Region varchar(15), PostalCode varchar(10), Country varchar(15), Phone varchar(24), Fax varchar(24), HomePage varchar(4000), PRIMARY KEY (SupplierID) )OPTIONS(UPDATABLE 'TRUE', EMBEDDABLE 'TRUE'); CREATE FOREIGN TABLE Shippers ( ShipperID integer NOT NULL, CompanyName varchar(40), Phone varchar(24), PRIMARY KEY (ShipperID) )OPTIONS(UPDATABLE 'TRUE', EMBEDDABLE 'TRUE'); CREATE FOREIGN TABLE Customers ( CustomerID varchar(5) NOT NULL, CompanyName varchar(40), ContactName varchar(30), ContactTitle varchar(30), Address varchar(60), City varchar(15), Region varchar(15), PostalCode varchar(10), Country varchar(15), Phone varchar(24), Fax varchar(24), PRIMARY KEY (CustomerID) )OPTIONS(UPDATABLE 'TRUE'); CREATE FOREIGN TABLE Employees ( EmployeeID integer NOT NULL, LastName varchar(20), FirstName varchar(10), Title varchar(30), TitleOfCourtesy varchar(25), BirthDate date, HireDate date, Address varchar(60), City varchar(15), Region varchar(15), PostalCode varchar(10), Country varchar(15), HomePhone varchar(24), Extension varchar(4), Photo varchar(40), Notes varchar(4000), ReportsTo integer, PRIMARY KEY (EmployeeID) ) OPTIONS(UPDATABLE 'TRUE'); CREATE FOREIGN TABLE Products ( ProductID integer NOT NULL, ProductName varchar(40), SupplierID integer NOT NULL, CategoryID integer NOT NULL, QuantityPerUnit varchar(20), UnitPrice float default '0', UnitsInStock integer default '0', UnitsOnOrder integer default '0', ReorderLevel integer default '0', Discontinued integer default '0', PRIMARY KEY (ProductID), FOREIGN KEY (CategoryID) REFERENCES Categories (CategoryID), FOREIGN KEY (SupplierID) REFERENCES Suppliers (SupplierID) ) OPTIONS(UPDATABLE 'TRUE'); CREATE FOREIGN TABLE Orders ( OrderID integer NOT NULL, CustomerID varchar(5), EmployeeID integer, OrderDate date, RequiredDate date, ShippedDate date, ShipVia integer, Freight float default '0', ShipName varchar(40), ShipAddress varchar(60), ShipCity varchar(15), ShipRegion varchar(15), ShipPostalCode varchar(10), ShipCountry varchar(15), PRIMARY KEY (OrderID), FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID), FOREIGN KEY (EmployeeID) REFERENCES Employees (EmployeeID), FOREIGN KEY (ShipVia) REFERENCES Shippers (ShipperID) ) OPTIONS(UPDATABLE 'TRUE'); CREATE FOREIGN TABLE OrderDetails ( odID integer, OrderID integer NOT NULL, ProductID integer NOT NULL, UnitPrice float default '0', Quantity integer default '1', Discount float default '0', FOREIGN KEY (OrderID) REFERENCES Orders (OrderID), FOREIGN KEY (ProductID) REFERENCES Products (ProductID), PRIMARY KEY (OrderID,ProductID) ) OPTIONS (EMBEDIN 'Orders', UPDATABLE 'TRUE'); ]]> </metadata> </model> <vdb>
There is only two (2) additional properties that are of specific to MongoDB translator.
Now lets see how these properties behave in different types of relationships on the schema
Limitations
|
When you use above properties and carefully design the MongoDB document structure, Teiid translator can intelligently collate data based on their co-location and take advantage of it while querying.
MongoDB translator designed on top of the MongoDB aggregation framework, use of MongoDB version that supports this framework is mandatory. This translator supports
Apart from SELECT, this translator also supports INSERT, UPDATE and DELETE.
All the operations involved are atomic, except for the "UPDATE" of a table that has property "EMBEDDABLE". Since Teiid maintains more than single copy of the data it not possible to modify the data every where with single atomic operation. Teiid hopes to provide a compensating transaction wrapping around this operation in future releases. |
"Native Queries" Native queries are not currently supported. |