In the last year I have been working on the development of MongoDB connector for Jolie ( First Language for microservices ). In my previous two posts I have been looking into the basic CRUD operations and how to program them with Jolie.
In this post I am going to look at the handling of ObjectID and cross collections relationships. The two topics are closely related as MongoDB used ObjectID to cross reference documents between collections.
Assigning ObjectID to a document and adding ObjectID reference to a document.
ObjectID is a MongoDB specific data type that is not native to Jolie , therefore like in previous cases where there was not direct correspondence between MongoDB data type and Jolie data type a the following semantic solution was adopted
The node "@type" signal to the connector that it needs to handle the value of the node "_id" as a ObjectID. The node "_id" it is a specific node name that will trigger the the assignment of a unique ObjectID to the document as shown in the following example
The response from the insert operation will return an structure identical to that used to insert the ObjectID
Of course one should really consider the opportunity of setting an objectID with a custom value, considering the all the drawbacks connected with handling the uniqueness of the value.
If the "_id" node is not defined the insert operation will return the auto generated value; that can be used to create documents cross referencing.
In a similar manner we can set one of the document fields as ObjectID to reference an other document as shown in the code under .
The resulting document looks like
We can see that the resulting document contains the auto generated "_id" and the reference to another object that is desired result.It is also clear that any time we can update the document adding further documents reference as shown in the following code.
The document now looks like
Cardinality of the relationship
When approaching MongoDB from a SQL prospective the first question came to my mind was "what about schema". In the excellent post "6 rules of thumb for MongoDB schema design" the author goes back to basic identifying three types of possible relationships:
The renaming two are more pertinent: and I will try to demonstrate to code these relationships with Jolie
In my example are present 3 collections that model a small part of a e-commerce solution:
- One to Few
- One to Many
- One to Squillions
The renaming two are more pertinent: and I will try to demonstrate to code these relationships with Jolie
In my example are present 3 collections that model a small part of a e-commerce solution:
- CustomerData
- CartData
- SearchData
The document for CartData( see below ) also contains a reference to a forth collection ProductData that will be not specified in this post.
In both cases the documents are modeling a One to Many relationship
The SearchData document ( see below ) acts as log of all the search activity logging the visited object by a the customer
The SearchData document is design to model One to Squllion or better Squillion to one
One to Many
We can imagine a situation where by on the end of the purchase the CustomerData will be updated adding the concluded CartID the code below shows how this would be done in Jolie
Of course this code is simplified and it does not consider any exceptions compensation or business logic consideration, but it aims to show how is possible to manipulate MongoDB ObjectID across collections using Jolie
One to Squillions
Although the used data model is probably not the most correct to keep track of the navigation history it is a simple example to give the idea how handle this problem in Jolie
Of course one should consider now how to search the data of this potentially enormous collection and how efficient this search may be but it is not topic of this post.