# Working with MongoDB using the Mongo Shell

By Atta Ur Rehman Shah (https://attacomsian.com/about). Published Dec 7, 2020, updated Oct 1, 2022. Topics: MongoDB.
Canonical URL: https://attacomsian.com/blog/working-with-mongodb-using-mongo-shell

> An introduction to the mongo shell and how to use it to access MongoDB from the command-line terminal.

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](https://attacomsian.com/blog/install-mongodb-macos) and [Ubuntu](https://attacomsian.com/blog/install-mongodb-ubuntu-18-04) installation instructions.

## Starting the `mongo` shell

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

```bash
$ mongo
```

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

```bash
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`:

```bash
$ 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:

```bash
> db
test
```

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

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

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

```bash
> 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:

```bash
> 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`:

```bash
> 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:

```bash
> 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:

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

To list all the available collections in the current database:

```bash
> show collections
foods
```

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

```bash
> 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:

```bash
> 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:

```bash
> 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:

```bash
> 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:

```bash
> 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:

```bash
> 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:

```bash
# 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:

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

### Delete a document

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

```bash
> 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:

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

MongoDB also provides two more methods &mdash; `deleteOne()` and `deleteMany()` &mdash; 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:

```bash
> db.foods.drop()
true
```

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

```bash
> db.rooms.drop()
false
```

### Delete a database

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

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

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

```bash
# 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:

```bash
> quit()
```

## What's next?

Read [this article](https://attacomsian.com/blog/nodejs-mongodb-local-connection) to learn how to access MongoDB programmatically using MongoDB native driver as well as Mongoose in a Node.js application.
