Read Data from MongoDB With Queries
Overview
In the previous guide, Read Data in MongoDB, you retrieved all documents
from the sample_guides.planets
collection without specifying any
criteria that the documents should meet.
In this guide, you will query the collection and retrieve documents that match specific equality criteria, meaning the values of the specified field or fields must match.
Time required: 15 minutes
What You'll Need
A connection string to your MongoDB deployment.
Sample datasets loaded into your cluster.
Procedure
Connect to your MongoDB instance.
Tip
In this code block there is a comment to replace the connection URI with your own. Replace the URI string with your own Atlas connection string.
Tip
The following is an outline with the minimum code necessary to connect to MongoDB. You'll make additions over the next few steps to read data.
At line 5, replace the URI string with your own Atlas connection string.
1 using MongoDB.Bson;
2 using MongoDB.Driver;
3
4 // Replace the uri string with your MongoDB deployment's connection string.
5 var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7 var client = new MongoClient(uri);
8
9 // database and collection code goes here
10 // find code goes here
11 // iterate code goes here
12
13
14
Tip
The following is an outline with the minimum code necessary to connect to MongoDB. You'll make additions over the next few steps to read data.
At line 11, replace the URI string with your own Atlas connection string.
1 package main 2 3 import ( 4 "context" 5 6 "go.mongodb.org/mongo-driver/mongo" 7 "go.mongodb.org/mongo-driver/mongo/options" 8 ) 9 10 func main() { 11 uri := "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 12 13 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) 14 if err != nil { 15 panic(err) 16 } 17 18 defer func() { 19 if err = client.Disconnect(context.TODO()); err != nil { 20 panic(err) 21 } 22 }() 23 24 // database and colletion code goes here 25 // find code goes here 26 // iterate code goes here 27 }
Tip
The following is an outline with the minimum code necessary to connect to MongoDB. You'll make additions over the next few steps to read data.
At line 8, replace the URI string with your own Atlas connection string.
1 import com.mongodb.client.*; 2 import com.mongodb.client.model.Filters.*; 3 import org.bson.Document; 4 import org.bson.conversions.Bson; 5 6 public class CrudRead { 7 public static void main(String[] args) { 8 String uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 9 10 try (MongoClient mongoClient = MongoClients.create(uri)) { 11 // database and collection code goes here 12 // find code goes here 13 // iterate code goes here 14 } 15 } 16 }
Tip
The following is an outline with the minimum code necessary to connect to MongoDB. You'll make additions over the next few steps to read data.
At line 4, replace the URI string with your own Atlas connection string.
1 const { MongoClient } = require("mongodb"); 2 // Replace the uri string with your MongoDB deployment's connection string. 3 const uri = 4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 5 const client = new MongoClient(uri); 6 async function run() { 7 try { 8 await client.connect(); 9 // database and collection code goes here 10 // find code goes here 11 // iterate code goes here 12 } finally { 13 // Ensures that the client will close when you finish/error 14 await client.close(); 15 } 16 } 17 run().catch(console.dir);
Tip
The following is an outline with the minimum code necessary to connect to MongoDB. You'll make additions over the next few steps to read data.
At line 4, replace the URI string with your own Atlas connection string.
1 from pymongo import MongoClient 2 3 # Replace the uri string with your MongoDB deployment's connection string. 4 uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 5 6 client = MongoClient(uri) 7 8 # database and collection code goes here 9 # find code goes here 10 # iterate code goes here 11 12 # Close the connection to MongoDB when you're done. 13 client.close()
Tip
mongodb+srv
Make sure you've installed PyMongo with the srv
option.
python3 -m pip install "pymongo[srv]"
Get the database and collection.
Switch to the database and collection you want to query. In this case
you will use the sample_guides
database and planets
collection.
// database and collection code goes here
var db = client.GetDatabase("sample_guides");
var coll = db.GetCollection<BsonDocument>("planets");
1 // database and colletion code goes here 2 db := client.Database("sample_guides") 3 coll := db.Collection("planets")
1 // database and collection code goes here 2 MongoDatabase db = mongoClient.getDatabase("sample_guides"); 3 MongoCollection<Document> coll = db.getCollection("planets");
// database and collection code goes here const db = client.db("sample_guides"); const coll = db.collection("planets");
# database and collection code goes here db = client.sample_guides coll = db.planets
Retrieve specific documents in the planets
collection.
You can retrieve specific documents from a collection by applying a query filter.
A query filter is a document that contains the criteria you are searching for.
The following example illustrates using a query filter to retrieve documents
from the planets
collection that have a hasRings
field
with a value of true
.
// find code goes here
var cursor = from planet in coll.AsQueryable()
where planet["hasRings"] == true
select planet;
Tip
BSON.D
should be used when sending documents to MongoDB,
because BSON.D
is ordered. This is important in more complex
operations.
1 // find code goes here 2 filter := bson.D{{"hasRings", true}} 3 cursor, err := coll.Find(context.TODO(), filter) 4 if err != nil { 5 panic(err) 6 }
The MongoDB Java Driver includes
Builders
that simplify the process of creating queries (and other operations).
Here, you use the Filters.eq
builder to construct the query document.
1 // find code goes here 2 Bson filter = eq("hasRings", true); 3 MongoCursor<Document> cursor = coll.find(filter).iterator();
// find code goes here const cursor = coll.find({ hasRings: true });
# find code goes here cursor = coll.find({"hasRings": True})
Iterate over the results.
// iterate code goes here
foreach (var document in cursor.ToEnumerable())
{
Console.WriteLine(document);
}
1 // iterate code goes here 2 for cursor.Next(context.TODO()) { 3 var result bson.M 4 if err := cursor.Decode(&result); err != nil { 5 panic(err) 6 } 7 fmt.Println(result) 8 } 9 if err := cursor.Err(); err != nil { 10 panic(err) 11 }
1 // iterate code goes here 2 try { 3 while (cursor.hasNext()) { 4 System.out.println(cursor.next().toJson()); 5 } 6 } finally { 7 cursor.close(); 8 }
Iterate the results and print them to the console. Operations like this are asychronous in the MongoDB Node.js driver by default, meaning the Node.js runtime doesn't block other operations while waiting for them to finish execution.
In order to simplify the operation, you specify the await
keyword, which will cause the runtime to wait for the operation.
This is often easier than specifying a callback, or chaining
a promise.
For more information, see the Promise and Callbacks guide.
// iterate code goes here await cursor.forEach(console.log);
# iterate code goes here for doc in cursor: print(doc)
Check your results.
Here is the complete code followed by sample output.
Note
Your ObjectId
values will differ from those shown.
Here is the complete code followed by sample output.
1 using MongoDB.Bson;
2 using MongoDB.Driver;
3
4 // Replace the uri string with your MongoDB deployment's connection string.
5 var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7 var client = new MongoClient(uri);
8
9 // database and collection code goes here
10 var db = client.GetDatabase("sample_guides");
11 var coll = db.GetCollection<BsonDocument>("planets");
12 // find code goes here
13 var cursor = from planet in coll.AsQueryable()
14 where planet["hasRings"] == true
15 select planet;
16 // iterate code goes here
17 foreach (var document in cursor)
18 {
19 Console.WriteLine(document);
20 }
21
22
{... 'name': 'Uranus', 'hasRings': True, ...} {... 'name': 'Neptune', 'hasRings': True, ... } {... 'name': 'Jupiter', 'hasRings': True, ... } {... 'name': 'Saturn', 'hasRings': True, ... }
Here is the complete code followed by sample output. The output documents have been truncated here for display purposes.
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 uri := "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 14 15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) 16 if err != nil { 17 panic(err) 18 } 19 20 defer func() { 21 if err = client.Disconnect(context.TODO()); err != nil { 22 panic(err) 23 } 24 }() 25 26 // database and colletion code goes here 27 db := client.Database("sample_guides") 28 coll := db.Collection("planets") 29 30 // find code goes here 31 filter := bson.D{{"hasRings", true}} 32 cursor, err := coll.Find(context.TODO(), filter) 33 if err != nil { 34 panic(err) 35 } 36 37 // iterate code goes here 38 for cursor.Next(context.TODO()) { 39 var result bson.M 40 if err := cursor.Decode(&result); err != nil { 41 panic(err) 42 } 43 fmt.Println(result) 44 } 45 if err := cursor.Err(); err != nil { 46 panic(err) 47 } 48 49 }
map[... hasRings:true name:Uranus ... ]] map[... hasRings:true name:Neptune ... ]] map[... hasRings:true name:Jupiter ... ]] map[... hasRings:true name:Saturn ... ]]
Here is the complete code followed by sample output.
1 import com.mongodb.client.*; 2 import com.mongodb.client.model.Filters.*; 3 import org.bson.Document; 4 import org.bson.conversions.Bson; 5 6 public class CrudRead { 7 public static void main(String[] args) { 8 String uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 9 10 try (MongoClient mongoClient = MongoClients.create(uri)) { 11 // database and collection code goes here 12 MongoDatabase db = mongoClient.getDatabase("sample_guides"); 13 MongoCollection<Document> coll = db.getCollection("planets"); 14 15 // find code goes here 16 Bson filter = eq("hasRings", true); 17 MongoCursor<Document> cursor = coll.find(filter).iterator(); 18 19 // iterate code goes here 20 try { 21 while (cursor.hasNext()) { 22 System.out.println(cursor.next().toJson()); 23 } 24 } finally { 25 cursor.close(); 26 } 27 } 28 } 29 }
{... 'name': 'Uranus', 'hasRings': True, ...} {... 'name': 'Neptune', 'hasRings': True, ... } {... 'name': 'Jupiter', 'hasRings': True, ... } {... 'name': 'Saturn', 'hasRings': True, ... }
Here is the complete code followed by sample output.
1 const { MongoClient } = require("mongodb"); 2 // Replace the uri string with your MongoDB deployment's connection string. 3 const uri = 4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 5 const client = new MongoClient(uri); 6 async function run() { 7 try { 8 await client.connect(); 9 // database and collection code goes here 10 const db = client.db("sample_guides"); 11 const coll = db.collection("planets"); 12 13 // find code goes here 14 const cursor = coll.find({ hasRings: true }); 15 16 // iterate code goes here 17 await cursor.forEach(console.log); 18 } finally { 19 // Ensures that the client will close when you finish/error 20 await client.close(); 21 } 22 } 23 run().catch(console.dir);
{... 'name': 'Uranus', 'hasRings': True, ...} {... 'name': 'Neptune', 'hasRings': True, ... } {... 'name': 'Jupiter', 'hasRings': True, ... } {... 'name': 'Saturn', 'hasRings': True, ... }
Here is the complete code followed by sample output.
1 from pymongo import MongoClient 2 3 # Replace the uri string with your MongoDB deployment's connection string. 4 uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 5 6 client = MongoClient(uri) 7 8 # database and collection code goes here 9 db = client.sample_guides 10 coll = db.planets 11 # find code goes here 12 cursor = coll.find({"hasRings": True}) 13 # iterate code goes here 14 for doc in cursor: 15 print(doc) 16 17 # Close the connection to MongoDB when you're done. 18 client.close()
{... 'name': 'Uranus', 'hasRings': True, ...} {... 'name': 'Neptune', 'hasRings': True, ... } {... 'name': 'Jupiter', 'hasRings': True, ... } {... 'name': 'Saturn', 'hasRings': True, ... }
Query using multiple criteria.
You can also query the collection using multiple criteria.
The following example illustrates using multiple criteria to retrieve
documents from the planets
collection that have a
hasRings
field with a value of false
and Argon(Ar)
as an
entry in the mainAtmosphere
field.
Here is the complete code followed by sample output.
1 // find code goes here
2 var cursor = from planet in coll.AsQueryable()
3 where planet["hasRings"] == false
4 where planet["mainAtmosphere"] == "Ar"
5 select planet;
{..., "name" : "Mars", "mainAtmosphere" : ["CO2", "Ar", "N"], ... } {..., "name" : "Earth", "mainAtmosphere" : ["N", "O2", "Ar"], ... }
Here is the complete code followed by sample output. The output documents have been truncated here for display purposes.
1 // find code goes here 2 filter := bson.D{ 3 {"$and", 4 bson.A{ 5 bson.D{{"hasRings", false}}, 6 bson.D{{"mainAtmosphere", "Ar"}}, 7 }, 8 }, 9 } 10 cursor, err := coll.Find(context.TODO(), filter) 11 if err != nil { 12 panic(err) 13 }
map[... hasRings:false mainAtmosphere:[CO2 Ar N] ... ]] map[... hasRings:false mainAtmosphere:[N O2 Ar] ... ]]
Here is the complete code followed by sample output.
1 // find code goes here 2 Bson filter = and(eq("hasRings", false), eq("mainAtmosphere", "Ar")); 3 MongoCursor<Document> cursor = coll.find(filter).iterator();
{..., "name" : "Mars", "mainAtmosphere" : ["CO2", "Ar", "N"], ... } {..., "name" : "Earth", "mainAtmosphere" : ["N", "O2", "Ar"], ... }
Here is the complete code followed by sample output.
1 // find code goes here 2 const cursor = coll.find({ hasRings: false, mainAtomsphere: "Ar" });
{..., "name" : "Mars", "mainAtmosphere" : ["CO2", "Ar", "N"], ... } {..., "name" : "Earth", "mainAtmosphere" : ["N", "O2", "Ar"], ... }
1 # find code goes here 2 cursor = coll.find({"hasRings": False, "mainAtmosphere": "Ar"})
{..., "name" : "Mars", "mainAtmosphere" : ["CO2", "Ar", "N"], ... } {..., "name" : "Earth", "mainAtmosphere" : ["N", "O2", "Ar"], ... }
Even though the mainAtmosphere
field is an array, you can use
a strict equality query because MongoDB treats arrays as first-class
types. During execution of the query, MongoDB compared each entry
in the array to the value you specified, in this case "Ar"
,
to determine if the documents matched your criteria.
Summary
If you have completed this guide, you have retrieved data from MongoDB using specific equality criteria. This is useful when you know exactly what you're searching for, for example an item number, a username, or chemical element.
In the next guide, you'll learn how to read data from MongoDB using comparison operators to retrieve documents that match a broader set of criteria.
See Also
See the following resources for more in-depth information about the concepts presented here:
The MongoDB C# Driver documentation
The MongoDB Go Driver documentation
The MongoDB Java(Sync) Driver documentation
The MongoDB Node.js Driver documentation
The PyMongo documentation
Use operators and compound queries to retrieve documents in MongoDB.