Configuring Lombok on IntelliJ - Installation of Lombok plugin

How to install/configure Lombok plugin on IntelliJ IDEA :

Steps :

1) Installation 
Using IDE built-in plugin system on Windows:
  • File > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
Using IDE built-in plugin system on MacOs:
  • Preferences > Settings > Plugins > Browse repositories... > Search for "lombok" > Install Plugin
Manually: 2) Restart IDE.
3) Enable Annotation Processing
 In your project: Click Preferences, "Build, Execution, Deployment", Compiler, Annotation Processors. Click Enable Annotation Processing
Enabling Annotation Processing on IntelliJ IDEA

Optional) IntelliJ and Eclipse compiler
If you're using Eclipse compiler with lombok, try this setup:
  • install plugin (above process)
  • change compiler setting:
  •  > Compiler > Java Compiler > Use Compiler: Eclipse
  •  > Compiler > Annotation Processors > Enable annotation processing: checked (default configuration)
  •  > Compiler > Additional build process VM options: -javaagent:lombok.jar

References :

MongoException$DuplicateKey: E11000 duplicate key error index - @Version

Obviously, we get this exception when we try to update/insert a document(record) with duplicate key field in MongoDB collection(table). There exists several explanation on this:

But, I was getting this error in a different scenario:

1) I already had a model User and data in it. Sample data were being created using mongeez change log file
2) Later, I added a new auditing field @Version to the entity definition.
3) When updating a User record, I got the above exception ( MongoException$DuplicateKey: E11000 duplicate key error index )

User entity :

@Document(collection = "user")
public class User implements Serializable {

    @NotNull    @Size(min = 5, max = 100)
    @Id    private String id;

    @Version    Long version; // THIS WAS ADDED LATER
    
    @Size(max = 50)
    @Field("first_name")
    private String firstName;
    @Field("last_name")
    private String lastName;

    @Email
    private String email;

 

Solution :

I added a property version and initialized to 1 in all documents


Mongo Change Log  : Using mongeez

<mongoChangeLog>
    <changeSet changeId="ChangeSet-2" author="gtiwari">
        <script>
            db.user.insert(
            {
                "_id" : "user1",
                "first_name": "",
                "last_name": "User 1",
                "email": "user1@localhost",
                "version":1  --> I UPDATED ALL user RECORDS'S VERSION = 1 TO SOLVE THIS
            });
 
 

Spring MongoDB _id field mapping conventions

Java Spring MongoDB  : '_id' field mapping :

MongoDB requires that you have an '_id' field for all documents. If you don’t provide one the driver will assign a ObjectId with a generated value. The "_id" field can be of any type the, other than arrays.

The following outlines what field will be mapped to the '_id' document field:
  • A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' field.
  • A field without an annotation but named 'id' will be mapped to the '_id' field.
  • The default field name for identifiers is '_id' and can be customized via the @Field annotation.

Examples for the translation of '_id'-field definitions

Field definition Resulting Id-Fieldname in MongoDB
String id
_id
@Field String id
_id
@Field('x') String id
x
@Id String x
_id
@Field('x') @Id String x
_id

Source :  How the '_id' field is handled in the mapping layer

MongoDB Multiple insert at once

We can insert multiple documents (bulk insert) to a collection using a single insert command :


Syntax :
   db.[COLLECTION].insert( [ { DOC1 }, {DOC2} ] ) ;

Example :
   db.people.insert( [ {name: "Ganesh", age: 24, country : "Nepal"}, {name: "John", age : 20} ]);

In Java  ( Using Spring Data JPA Repository )

   personRepository.insert( personList);
   --> It follows org.springframework.data.mongodb.repository.MongoRepository#insert(Iterable<S> entities) method's syntax

MongoDB rename a database

As of now, there is not a straight forward way to rename a MongoDB database. But you can use the following steps to achieve so :

Here, we are trying to rename OLD_DB to NEW_DB

Steps :
1) copy old database to new one using db.CopyDatabase( OLD_DB, NEW_DB )
2) switching to OLD_DB and dropping the database

Mongo Command :

  #Step 1 : Copy database to new name
     db.copyDatabase("OLD_DB","NEW_DB") 

  #Step 2 and 3, drop OLD_DB
     use OLD_DB
     db.dropDatabase()

MongoDB Drop Database

We can use the following query to drop ( DELETE EVERYTHING) from a MongoDB database

( please be careful on running the query, it deletes everything )

   use [database]
   db.dropDatabase() 

MongoDB Like Query

We can do the following to achieve SQL's LIKE equivalent on a Query :


MongoDB :  db.users.find({"name": /jo/})

MYSQL Equivalent:   select * from users where name like '%jo%' 

MongoDB - show all database in server

We can use following commands to view all databases in the server
   show dbs
OR
   show databases

MongoDB - List all collection from selected DB

There are two ways to do so, so far :

1 ) using  reference variable 'db'
     db.getCollectionNames()

2) using show command
    show collections

MongoDB : use database / switch to different database

MongoDB uses same syntax as SQL/MySQL to switch to different database :

MongoDB Syntax :
    use DATABASE_NAME
SQL Syntax :
     use DATABASE_NAME ;