Getting Started with Informix®'s MongoDB Solution
This topic covers the basics of getting started with using MongoDB API with Informix®.
How does Informix® support the MongoDB API?
The Informix® wire listener implements the MongoDB wire protocol. This allows MongoDB applications to connect to the Informix® wire listener and its associated Informix® database server. These applications communicate with Informix® as if it was a MongoDB server, with the wire listener acting as a translation layer between theMongoDB wire protocol and the SQL understood by the Informix® database server.
What are the components of the Informix® MongoDB solution?
There are three main components: the OneDB® server, the wire listener, and a MongoDB client. The wire listener is a mid-tier gateway server that enables communication between the MongoDB client and the OneDB® server.
How are JSON collections different from relational tables?
A JSON collection holds BSON (binary JSON) data. BSON documents have a flexible schema and can be used with unstructed data, meaning the structure and contents of BSON documents can differ from one document to another. This differs from relational tables where all rows must following the same predefined structure.
Informix® fully supports JSON collections, which can be created through the wire listener. Additionally, the wire listener also makes it possible to run MongoDB queries against your traditional relational tables, using the same MongoDB API that you would use with JSON collections.
How do MongoDB commands map to SQL features?
| MongoDB collection methods | Informix SQL statements |
find |
SELECT |
save/insert |
INSERT |
remove |
DELETE |
update |
UPDATE |
ensureIndex |
CREATE INDEX |
sort |
ORDER BY |
limit |
LIMIT/FIRST |
Commonly customizable wire listener properties
The properties that control the wire listener and the connection between the client and database server are set in the wire listener configuration. The url parameter is required, but all other parameters are optional. Here are the commonly customized parameters.
url
This required parameter specifies the host name, database server, user ID, and password that are used in connections to the Informix® database server.
authentication.enable
This optional parameter indicates whether to enable user authentication. The default value is false.
listener.port
This optional parameter specifies the port number to listen on for incoming connections from MongoDB clients. The default value is 27017.
security.sql.passthrough
This optional parameter indicates whether to enable support for issuing SQL statements through the MongoDB API. The default value is false.
sharding.enable
This optional parameter indicates whether to enable the use of commands and queries on sharded data. The default value is false.
Starting the wire listener from the command line
You can start the wire listener by using a system command. For example:
java -jar onedb-wire-listener.jar
-config onedb-wire-listener.properties
-logFile onedb-wire-listener.log -loglevel info -start MongoDB Create, read, update, and delete (CRUD) operations on collections and tables
These standard MongoDB CRUD operations are supported by Informix®:
insertfindupdateremove
This table shows an example of MongoDB operations and comparable SQL statements against relational tables. In the example, the retirement age of a customer is queried:
| MongoDB operation | Informix SQL statement |
db.customer.insert( { name: “John", age: 65 } )
|
INSERT INTO customer (name, age) VALUES (“John”,65)
|
db.customer.find() |
SELECT * FROM customer
|
db.customer.find( {age: { $gt:65 } }
) |
SELECT * FROM customer WHERE age > 65
|
db.customer.drop() |
DROP TABLE customer
|
db.customer.ensureIndex( { name : 1, age : -1 }
) |
CREATE INDEX idx_1 on customer(name, age DESC)
|
db.customer.remove( {age: { $gt:65 } }
) |
DELETE FROM customer where age > 65
|
db.customer.update( { age: { $gt: 64 } }, { $set: {
status: “Retire" } }, { multi: true } )
|
UPDATE customer SET status = “Retire" WHERE age >
64
|
Implicit operations for JSON collections and databases
If you insert into a non-existent JSON collection, a collection is implicitly created.
If you create a JSON collection in a non-existent database, a database is implicitly created.
Creating and listing indexes
You can use the MongoDB ensureIndex syntax to create an index that works for all data types. For example:
db.collection.ensureIndex( { zipcode: 1 } )db.collection.ensureIndex( { state: 1, zipcode: -1} )You can use the Informix® ensureIndex syntax to create an index for a specific data type. For example:
db.collection.ensureIndex( { zipcode : [1, “$int”] } )db.collection.ensureIndex( { state: [1, “$string”], zipcode: [-1, “$int”] } )You can list indexes by running the MongoDB getIndexes command.
Accessing multiple databases per connection
In standard OneDB® JDBC connections, you must specify the database name on the connection string and you must create one connection per database. In MongoDB, all messages include a fully qualified namespace that includes the database name and the collection. MongoDB connections are not associated with a particular database and each individual message or command specifies the intended database. A single MongoDB connection can switch between databases.
Moving data to and from collections and tables
You can run the MongoDB mongodump and mongoexport utilities to export data from MongoDB to OneDB®.
You can run the MongoDB mongorestore and mongoimport utilities to import data from MongoDB to OneDB®.
Viewing usage statistics
You can run the MongoDB
serverStatus command to get the wire listener status information, including:
- Uptime
- Number of active and available connections
- Number of open cursors
- Total number of requests
- Counters for the number operations (queries, inserts, updates, deletes, commands, etc)