Introduction
This is the first part and as we are new to MongoDB and No-SQL. I would like to start with the definition of NoSQL.
NoSQL
NoSQL stands for Not Only SQL. NoSQL is a not relational based database. NoSQL databases does not follow the rules of RDMS and NoSQL databases does not use SQL to query the data.
NoSQL databases can be divided in to four categories
- Document Store
- Graph Store
- Column Value Store
- Key-Value Store
MongoDB comes under Document Store database
Document Store Databases: In Document Store Database, Data is stored in form of documents. it extends the Key value Store Database Concept.
Mongo DB and Couch DB are two main Document Store Databases .Mongo DB stores data in form of Documents. Here is an example of sample document.
Set up Mongo DB on Machine
Download MongoDB from below MongoDB official Site (Download MSI file as per your Operating System).
Install MSI file (In case of Window Operation System,Default Location is (C:\Program Files\MongoDB)
Copy this folder and Place this in your C Drive or any other drive and Create a Folder in C drive named data and a Folder named db inside data folder.
So In C Drive we have two folders now,
- MongoDB (Copied from Installation Location)
- data/db (Create a folder named data and a folder named db inside data Folder)
Start Mongo DB
Go to the bin folder inside MongoDB folder which we placed in c Drive.
In my case bin Folder is inside MongoDB folder(It can be inside server folder as well as below) C:\Program Files\MongoDB\Server\3.0\bin and double click on the Mongod.exe (It will open a command Prompt and it will start the MongoDB server).
Last line should say "Waiting for connections..." as below it means our Mongo DB server has been started successfully
Download RoboMongo
RoboMongo. Shell-centric cross-platform open source MongoDB management tool (i.e.... Admin GUI). [It] embeds the same JavaScript engine (based on Mozilla SpiderMonkey), that powers MongoDB's mongo shell. It means that you can reuse your existing skills of MongoDB Shell in Robomongo
We can download Robomongo from Robomongo Original Site named Robomongo.org.
Once download. Run the exe and Go to the File-->Connect (Make sure your mongodb server is up and running which we ran in last step through Mongod.exe)
MongoDB Terminology
Before going foreword we should know the terminology of MongoDB,
Operation | In SQL | In MongoDB |
Create | Insert | Insert |
Read | Select | Find |
Update | Update | Update |
Delete | Delete | Remove |
Table | Table | Collection |
Row | Row | Document |
Key points of MongoDB
- MongoDB Stores Data in Json Format(We call it BSON(Binary JSON)).
- JSON stands for JavaScript Object Notations and looks like {“Name”:”Vijay”}.
- JSON documents store data in Key Value Pair like {“X”:1,”Y”:2,”Z”:3}.
- There are two basic structure inside JSON is,
a. Array - List of things is represented in List of Items [……..]
b. Dictionaries - Associate Maps {key:Value}
For example {Name : ‘Vijay’,City : ‘Shamli’,interest : ["Sports" ,"Music" ]}
Name and city is dictionary and Interest is an Array.
- Mongo Db is Schema less , Schema Less means two documents don’t need to be same schema.
First Document in a collection can be - {Name:"Vijay",Email:"[email protected]"}
Second Document in same collection can be - {Name:"Vijay",Email:"[email protected]",Address : "Delhi"}
- MongoDB does not support Joins.
- Mongo DB does not support Transactions.
It's Query Time
We will see here some of the queries which we run in Sql server on a daily basis and equivalent queries in Mongo DB.
For this I created a table in SQL server with below schema and a same collection (Remember table is a collection in MongoDB) in MongoDB.
We will create the same table in MongoDB and different operations on this table using MongoDB.
Operation | SQL | MongoDB |
Select Database | use Test | use Test |
We will get a message "switched to db Test",
Insert Record | Insert into Student Values(1,'Vijay', '[email protected]', '9711965544','Delhi') | db.Student.insert( {"_id":1,"Name":"Vijay","Email":"[email protected]", "PhoneNo":"9711965544","Address":"Delhi"} ) |
Note: _id works as a primary key in MongoDb. if we will not insert any value in this column then MongoDB will automatically insert a unique ID in Table.
Inserting some more records in both Sql Server and in MongoDB (Attaching Sql script and MongoDB script).
Download InsertRecord.zip from top of this article.
After Running scripts we have below data in Student table (Sql server and in MongoDB) databases.
Select | Select all Columns
select * from student
Select few Column
select ID,Name from Student | Select all Columns
db.Student.find()
Select few Column
db.Student.find({},{"Name":true})
We use find() Method to pull all the records from the table. |
Where Clause | select * from student where Name='Vijay' | db.Student.find({Name:"Vijay"}) |
Greater Than and Less Than | select * from student where ID>2 select * from student where ID>=2 select * from student where ID<2 select * from student where ID<=2 | db.Student.find({_id:{$gt:2}}) db.Student.find({_id:{$gte:2}}) db.Student.find({_id:{$lt:2}}) db.Student.find({_id:{$lte:2}})
We use $gt/$gte for Greater Than/Greater Than Equal and $lt/$lte for Less Than/Less Than Equal |
Like | Below query will Find all the records where letter P exist somewhere in Name Column,
select * from student where Name like '%P%'
Suppose we want to find all the records where Name ends with letter 'a'
select * from student where Name like '%a'
Suppose we want to fetch all the records where Name starts with Letter 'P'
select * from student where Name like 'p%' | In Mongo DB we use $regex operator to check whether letter 'P' exist somewhere in Name Column.
db.Student.find({Name:{$regex:"P"}})
Below query will Fetch all the records where Name ends with letter 'a'
db.Student.find({Name:{$regex:"a$"}})
Below query will Fetch all the records where Name starts with letter 'P'
db.Student.find({Name:{$regex:"^P"}}) |
And/Or | And
select * from Student where Name ='Vijay' and phoneNo='9711965544'
Or
select * from Student where Name ='Vijay' or phoneNo='9711997119' | And - db.Student.find({$and :[{Name :'Vijay'},{PhoneNo : '9711965544'}]}) Or - db.Student.find({$or:[{Name :'Vijay'},{PhoneNo : '9711997119'}]}) |
in | select * from Student where id in(1,3,5) | db.Student.find({_id:{$in:[1,3,5]}}) |
Count/Sort | Count all the records
select count(*) from Student
Sort Records in ascending order
select * from student order by Name
Sort in descending order
select * from student order by Name desc | Count all the records
db.Student.find().count()
Sort Records in ascending order
db.Student.find().sort({Name:1})
Sort in descending order
db.Student.find().sort({Name:-1}) |
Update | update student set phoneNo='2222222222', Address='USA' where ID=4 | db.Student.update({_id:4},{$set:{PhoneNo:'2222222222',Address:'USA'}})
Upsert
db.Student.update({_id:9},{$set:{PhoneNo:'2222222222',Address:'USA'}},{upsert:true}) above query will search a document where _id is 9. it there will be a _id with 9 it will update phoneNo and Address otherwise it will insert a new document where _id is 9.
Multi
Suppose we execute below query.
db.Student.update({Name:"Vijay"},{$set:{PhoneNo:'2222222222',Address:'USA'}})
It will update only one record(remember only first Match where name is "Vijay"). But if we want to update all the records where Name is "Vijay" then we will pass multi argument also db.Student.update({Name:"Vijay"},{$set:{PhoneNo:'2222222222',Address:'USA'}},{multi:true}) |
Delete/Remove/Drop | Delete with Condition
Delete from student where ID=5
Delete all the records
Delete from Student
Drop
drop table Student | Delete with Condition
db.Student.remove({_id:5})
Delete all the records
db.Student.remove({})
Drop
db.Student.drop() |
Top | select Top 2* from Student | Limit
db.Student.find().limit(2)
Skip
db.Student.find().skip(2).limit(2)
As name suggest skip will skip the number of documents and limit will limit the number of records. |
distinct | select distinct Name from Student | db.Student.distinct("Name") |
Backup | BACKUP DATABASE Test TO DISK = 'C:\Vijay\Test.Bak' WITH FORMAT, MEDIANAME = 'Z_SQLServerBackups', NAME = 'Full Backup of Test Database'; | Go to the command Prompt and run the below command (assuming your mongodump exe is inside bin folder, if it is a different location then change this location accordingly) C:\Program Files\MongoDB\Server\3.0\bin\mongodump --db Test |
MongoDB Functions
In MongoDB databases we can create functions like in Sql Server. MongoDB provides us a collection named as System.js for this.
System.js collection contains two keys
1. _id - _id is the function name.
2. value - value contains actual function defination.
For example, suppose we want to create a function which will accept two parameters named firstname and lastname and will return full name.
- db.system.js.save
- ({
- _id: "FullName",
- value: function(FirstName, LastName)
- {
- return FirstName + ' ' + LastName;
- }
- })
In order to call this function we need to load server scripts first, and than we can call this function as below,
- db.loadServerScripts();
- FullName('Vijay', 'Rana')
Vijay Rana will be the result when we will call this function.
Auto Increment ID( Identity in Sql Server) in MongoDB
In MongoDB _id works as a primary key. If we don't insert any value in _id field then MongoDB automatically inserts a unique hexadecimal value in this column. But if we want to enter auto increment integer value (Like Identity in Sql Server or Sequence in Oracle) in this field then there is no direct way to do so. For this we need to follow the below steps
Step 1 - Create a collection( Identity in my case) which will hold the counter.
- db.createCollection("Identity")
Step 2 - Insert a document in this collection with intial counter value,
- db.Identity.insert
- ({
- _id: "incrementID",
- sequence_value: 0
- })
Step 3 - Create a function which will increment this sequence_value and add that function in system.js as below,
- db.system.js.save
- ({
- _id: "getNextIdentity",
- value: function getNextIdentity(sequenceName)
- {
- var sequenceDocument = db.Identity.findAndModify
- ({
- query:
- {
- _id: sequenceName
- },
- update:
- {
- $inc:
- {
- sequence_value: 1
- }
- },
- new: true
- });
- return sequenceDocument.sequence_value;
- }
- })
Step 4 - While inserting a document we can call this function, which will return a incremented value as below,
- db.Employee.insert
- ({
- "_id": getNextIdentity("incrementID"),
- "EmpName": "Vijay",
- "Age": "30"
- })
In the next article I will talk about the rest of the MongoDB commands, How we will Generate Auto Increment ID as we normally do in Sql Server(Identity Column) and we will see the connectivity of .Net with MongoDB.