Jacob Pelletier
Posted on February 4, 2023
MongoDB Guide | Modifying Query Results
by Jacob Pelletier
Contact me for suggestions, comments, or just to say hello at jacob@yankeedo.io! 👋
Follow me on my journey in learning MongoDB.
I highly recommend checking out Mongo University!
What will we be covering in this guide
- Return results of a query in a specified order
- Limit number of documents
Returning results of a query in a specified order and limiting the number of documents returned.
To perform theses tasks, we will take advantage of cursors and cursor methods.
A Cursor is a pointer to the result set of a query. There are two cursor methods, cursor.sort() and cursor.limit(). db.collection.find() method returns a cursor of documents that match that query. Cursor methods are chained to queries and perform actions on the result set.
First, connect to our DB and take a look.
Sort() specifies the order in which the query returns matching documents. You must apply
sort() to the cursor before retrieving any documents from the database.
Note:
MongoDB does not store documents in a collection in a particular order. When sorting on a field which contains duplicate values, documents containing those values may be returned in any order.
If consistent sort order is desired, include at least one field in your sort that contains unique values. The easiest way to guarantee this is to include the _id field in your sort query.
Sort results:
Let's sort by property_type
and return listing name
alphabetically.
db.listingsAndReviews
.find({property_type:"House"})
.sort({name:1})
A value of 1 means to sort in ascending order, while a value of -1 will mean descending order on that property.
We can add a projection to make the results easier to read.
db.listingsAndReviews
.find({property_type:"House"},
{name:1})
.sort({name:1})
In MongoDB, capitol letters are sorted first, then lowercase letters.
Limit results:
If you wanted return a document on two conditions:
Let's find a house, apartment or condo in the US, sort results by listing name in ascending order, and limit results to 5.
db.listingsAndReviews
.find({property_type:
{$in: ["House", "Apartment", "Condo"]},
"address.country_code": "US"})
.sort({name:1})
.limit(5)
Note: The use of dot notation while accessing nested information is required.
From MongoDB docs:
Notice that these operations must occur in a specific order. First db.collection.find(), then sort(), then limit().
Choosing what data to return from a query.
Because you rarely want to return EVERYTHING.
This process is called projection (did you catch that we used it above?). Limiting which fields are returned may improve application performance.
This is an example of a projection.
cd.collection.find(
{<field1> : <value1>},
{<field2> : <value2>,
<field3> : <value3>})
Here, we are finding documents that match <field1> : <value1>
, and specifying the projection on {<field2> : <value2>, <field3> : <value3>}
. Stop to appreciate the difference between finding a document based on two fields, and this projection.
// finding on two fields
db.collection.find(
{<field1> : <value1>,
<field2> : <value2>})
// finding on one field and projecting on another
cd.collection.find(
{<field1> : <value1>},
{<field2> : <value2>})
The ID field (_id) is always returned by default. If you do not wish to return the ID field, you can include _id to the projection and setting the value to 0. By setting the value to 0, you are telling MongoDB to exclude this field from the results.
cd.collection.find(
{<field1> : <value1>},
{<field2> : <value2>,
<field3> : <value3>},
_id : 0})
Inclusion and exclusion statements cannot be combined!
You can choose to include fields or include fields, but not both.
The only exception to this rule is the _id field, which may be included with inclusion statements.
db.listingsAndReviews
.find({"property_type":
{$in: ["House", "Apartment", "Condo"]},
"address.country_code": "US"},
{"name":1, "property_type":1, "address.country_code":1, "_id":0})
.sort({name:1})
.limit(5)
From MongoDB docs:
*Can you guess what this query does?
*
db.sales.find({ "customer.age": { $lt: 30 },
"customer.satisfaction": { $gt: 3 },
},
{ "customer.satisfaction": 1,
"customer.age": 1,
"storeLocation": 1,
"saleDate": 1,
"_id": 0, }
);
*What about this code?
*
db.sales.find({ storeLocation: {
$in: ["Seattle", "New York"] },
}, {
couponUsed: 0,
purchaseMethod: 0,
customer: 0,
})
Counting documents in a collection
What method allows you to count documents?
db.collection.countDocuments(<query>, <options>
The total number of documents in our listingsAndReviews collection.
The total number of listing with greater than 5 beds.
db.listingsAndReviews
.countDocuments({"beds":{ $gt: 5 }})
Can you guess what this code does?
db.sales.countDocuments({
items: {
$elemMatch: {
name: "laptop",
price: { $lt: 600 }
}
}
})
Resources From Mongo University
Use the following resources to learn more about modifying query results in MongoDB:
Lesson 01: Sorting and Limiting Query Results in MongoDB
MongoDB Docs: cursor.sort()
MongoDB Docs: cursor.limit()
Lesson 02: Returning Specific Data from a Query in MongoDB
MongoDB Docs: Project Fields to Return from Query
MongoDB Docs: Projection Restrictions
Lesson 03: Counting Documents in a MongoDB Collection
MongoDB Docs: db.collection.countDocuments()
See you in the next guide!
Next guide will be posted soon!
Posted on February 4, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.