Working with MongoDB using the Mongo Shell

MongoDB provides an interactive JavaScript interface called the mongo shell that you can use to connect to a running MongoDB instance from your command-line terminal.

The mongo shell can be used to query and update data, to perform administrative tasks. It is already included as part of the MongoDB installation package, so you don't need to install anything.

Note that this article assumes that MongoDB is already installed and running on your machine. If you have not installed MongoDB yet, look at these macOS and Ubuntu installation instructions.

Starting the mongo shell

To start the mongo shell without any command-line options, you use the mongo command:

$ mongo

It will launch the mongo shell and connect to a MongoDB instance running on the localhost with default port 27017:

MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b52d0db7-f3eb-4674-b1a7-4a774d704a3a") }
MongoDB server version: 4.4.1
---
The server generated these startup warnings when booting: 
        2020-12-06T16:07:11.633+05:00: ***** SERVER RESTARTED *****
        2020-12-06T16:07:12.718+05:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> 

To explicitly specify the port, use the --port command-line option. For example, to connect to a MongoDB instance running on localhost with a non-default port 88657:

$ mongo --port 88657

Working with the mongo shell

Once the mongo shell is started, you can type any command it understands.

Display all databases

To display the currently active database, use the db command:

> db
test

To list all the available databases, use the show dbs command:

> show dbs
admin      0.000GB
config     0.000GB
local      0.000GB

To switch to any database, type use <db>:

> use local
switched to db local

Create a database

MongoDB has no CREATE SCHEMA statement like the one you might have used before in MySQL.

To create a new database in MongoDB, you simply switch to a non-existent database and then insert data into it:

> use hotel
switched to db hotel

However, the database is not created until you insert data into it. You can confirm it by typing show dbs:

> show dbs
admin      0.000GB
config     0.000GB
local      0.000GB

As you can see above, the hotel database is not listed among available databases, just because it doesn't include any collection yet.

Create a collection

In MongoDB, collections are like tables in a relational database. The collections are typically used to group the related documents. For example, you could create a users collection to group all users.

You can create a new collection on the current database using the db.createCollection() command. It accepts two arguments: the name of the collection and an optional object that you want to insert:

> db.createCollection('foods')
{ "ok" : 1 }

You could also create a collection on the fly by inserting a new document into a non-existent collection with the insert() method:

> db.foods.insert({ name: 'Pizza 🍕' })
WriteResult({ "nInserted" : 1 })

To list all the available collections in the current database:

> show collections
foods

Once the first collection is created, you should see the hotel database listed among all available databases:

> show dbs
admin      0.000GB
config     0.000GB
hotel      0.000GB
local      0.000GB

Create a document

MongoDB provides the following three methods for inserting documents into a database:

  • insert()
  • insertOne()
  • insertMany()

The insert() method inserts one or more documents into a collection:

> db.foods.insert({ name: 'Cake 🎂' })
WriteResult({ "nInserted" : 1 })

# Insert multiple documents
> db.foods.insert([ { name: 'Burger 🍔' }, { name: 'Cookie 🍪' } ])
BulkWriteResult({
	"writeErrors" : [ ],
	"writeConcernErrors" : [ ],
	"nInserted" : 2,
	"nUpserted" : 0,
	"nMatched" : 0,
	"nModified" : 0,
	"nRemoved" : 0,
	"upserted" : [ ]
})

The insertOne() method is just like insert(), but it can only be used to insert one document into a collection:

> db.foods.insertOne({ name: 'Apple 🍎' })
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5fce1b8eebb8a835319c0adc")
}

The insertMany() method, as the name suggests, can be used to insert multiple documents at once:

> db.foods.insertMany([ { name: 'Orange 🍊' }, { name: 'Cheese 🧀' } ])
{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("5fce1bacebb8a835319c0add"),
		ObjectId("5fce1bacebb8a835319c0ade")
	]
}

List documents

To list all documents stored in a collection, use the find() method:

> db.foods.find()
{ "_id" : ObjectId("5fce1b62ebb8a835319c0ad8"), "name" : "Pizza 🍕" }
{ "_id" : ObjectId("5fce1b71ebb8a835319c0ad9"), "name" : "Cake 🎂" }
{ "_id" : ObjectId("5fce1b7debb8a835319c0ada"), "name" : "Burger 🍔" }
{ "_id" : ObjectId("5fce1b7debb8a835319c0adb"), "name" : "Cookie 🍪" }
{ "_id" : ObjectId("5fce1b8eebb8a835319c0adc"), "name" : "Apple 🍎" }
{ "_id" : ObjectId("5fce1bacebb8a835319c0add"), "name" : "Orange 🍊" }
{ "_id" : ObjectId("5fce1bacebb8a835319c0ade"), "name" : "Cheese 🧀" }

As you can see above, an additional _id attribute was added to each document we inserted. This is the unique ID automatically generated by MongoDB for us.

You can also pass an object as a parameter to find() to filter out results:

> db.foods.find({ name: 'Burger 🍔' })
{ "_id" : ObjectId("5fce1b7debb8a835319c0ada"), "name" : "Burger 🍔" }

Update a document

To update an existing document in MongoDB, you can use the update() method or the save() method.

The update() method updates values in one or more documents, while the save() method replaces the existing document with the object passed as a parameter.

Here is an example of the update() method:

# Fetch an existing document
> db.foods.find({ _id: ObjectId('5fce1bacebb8a835319c0ade') })
{ "_id" : ObjectId("5fce1bacebb8a835319c0ade"), "name" : "Cheese 🧀" }

# Update the document
> db.foods.update({ _id: ObjectId('5fce1bacebb8a835319c0ade') }, { name: 'Fries 🍟' })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

# Fetch the updated document
> db.foods.find({ _id: ObjectId('5fce1bacebb8a835319c0ade') })
{ "_id" : ObjectId("5fce1bacebb8a835319c0ade"), "name" : "Fries 🍟" }

The save() method combines both insert() and update() methods into one. When you use the save() method, if the document exists, it will be updated. If the document doesn't exist, it will be created:

> db.foods.save({ name: 'Pancakes 🥞' })
WriteResult({ "nInserted" : 1 })

Delete a document

You can use the remove() method to delete a document from a collection:

> db.foods.remove({ _id: ObjectId('5fce1bacebb8a835319c0ade') })
WriteResult({ "nRemoved" : 1 })

To remove all the documents from a collection, just pass an empty object to the remove() method:

> db.foods.remove({})
WriteResult({ "nRemoved" : 7 })

MongoDB also provides two more methods — deleteOne() and deleteMany() — for removing one and multiple documents from a collection.

Delete a collection

To drop an existing collection from the current database, you can use the drop() method:

> db.foods.drop()
true

If you try to delete a non-existent collection, the drop() method returns false:

> db.rooms.drop()
false

Delete a database

In MongoDB, you can drop the current database by running the db.dropDatabase() method:

> db.dropDatabase()
{ "dropped" : "hotel", "ok" : 1 }

Alternatively, you could also use the dropDatabase command to achieve the same result:

# Switch to the database
> use test
switched to db test

# Drop database
> db.runCommand({ dropDatabase: 1 })
{ "ok" : 1 }

Exit the mongo shell

To exit the mongo shell, type quit() or use the <Ctrl-C> shortcut:

> quit()

What's next?

Read this article to learn how to access MongoDB programmatically using MongoDB native driver as well as Mongoose in a Node.js application.

✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.

You might also like...

Digital Ocean

The simplest cloud platform for developers & teams. Start with a $200 free credit.

Buy me a coffee ☕

If you enjoy reading my articles and want to help me out paying bills, please consider buying me a coffee ($5) or two ($10). I will be highly grateful to you ✌️

Enter the number of coffees below:

✨ Learn to build modern web applications using JavaScript and Spring Boot

I started this blog as a place to share everything I have learned in the last decade. I write about modern JavaScript, Node.js, Spring Boot, core Java, RESTful APIs, and all things web development.

The newsletter is sent every week and includes early access to clear, concise, and easy-to-follow tutorials, and other stuff I think you'd enjoy! No spam ever, unsubscribe at any time.