Now we will query the collection. This capability is provided via the Mongoose schema class we used to create the `Course` [model](/Databases/MongoDB/Create_collections_and_documents_with_Mongoose.md#models). We have the following methods available to use from the schema:
*`find`
*`findById`
*`findByIdAndRemove`
*`findByIdAndUpdate`
*`findOne`
*`findOneAndUpdate`
*`findOneAndRemove`
* ...
The various `find` methods return a value that is promisified.
So far when filtering we have been doing so with reference to properties that exist on the document's model (`author`, `isPublished` etc) and we have applied tranformations on the data returned (sorting, limiting the number or matches etc.). However we can also apply **operators** within our queries. Operators allow us to perform computations on the data, for example: for a given numerical property on an object, return the objects for which this value is within a certain range.
When we apply logical operators, we do not apply the query within the main `find` method. We use a dedicated method that corresponds to the logical predicate.
For example to query by logical [OR](/Logic/Truth-functional_connectives.md#disjunction):
We previously used the `limit()` method to control how many matches we return from a query. We can extend this functionality by creating pagination. This allows us to meter the return values into set chunks. This is used frequently when interacting with a database through a mediating RESTful API. For example to return values from endpoints such as:
```
/api/courses?pageNumber=2&pageSize=10
```
To do this you pass two values as query parameters