Showing posts with label MongoDB. Show all posts
Showing posts with label MongoDB. Show all posts

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 ;