Introduction to MongoDB cursor.readPref() Method

MongoDB is a NoSQL database that can store a large amount of unstructured or semi-structured data. In MongoDB, we can use the cursor.readPref() method to set the preference for reading data. This method allows us to specify which read mode to use to retrieve data.

Syntax

cursor.readPref(mode: string, tags: object)

This method accepts two parameters:

  • mode: read mode, i.e., the preference for data retrieval.
  • tags: tags used to specify the nodes to read data from.

Use cases

In a distributed environment, a MongoDB cluster may have multiple nodes storing data, which may have different hardware configurations, network environments, and other factors. Therefore, we can use the cursor.readPref() method to specify the data retrieval preference to better utilize these nodes’ resources.

For example, in a MongoDB cluster with three nodes: node1, node2, and node3, we can use node1 and node2 as read nodes and node3 as a backup node. In this case, we can use the following code to set the read preference:

db.collection.find().readPref("nearest", [{ dc: "east" }, { use: "reporting" }])

In this example, we set the read mode to nearest and specify two tags {dc: 'east'} and {use: 'reporting'}. This tells MongoDB that we want to prioritize using the nearest node and prioritize selecting nodes configured as dc: 'east' and use: 'reporting'.

Examples

Here are two examples using the cursor.readPref() method.

Example 1

Suppose we have a MongoDB collection storing user data with three nodes: node1, node2, and node3. We want to use node1 and node2 first when reading data and use node3 as a backup node. We can use the following code:

db.users
  .find()
  .readPref("primaryPreferred", [{ node: "node1" }, { node: "node2" }])

This tells MongoDB that we want to use the primary node or prefer nodes configured as node: 'node1' or node: 'node2' when reading data.

Example 2

Suppose we have a MongoDB collection storing product data with three nodes: node1, node2, and node3. We want to use the nearest node when reading data and prefer nodes configured as dc: 'east' and use: 'reporting'. We can use the following code:

db.products.find().readPref("nearest", [{ dc: "east" }, { use: "reporting" }])

This tells MongoDB that we want to prioritize using the nearest node and prioritize selecting nodes configured as dc: 'east' and use: 'reporting'.

When using the cursor.readPref() method, we can meet different needs by setting different read preferences. In the previous example, we used the primaryPreferred read preference to tell MongoDB that we want to prioritize using the nearest node and prefer nodes configured as primary.

In addition to primaryPreferred, there are several other read preferences that can be used:

  • primary: Prioritizes reading data from the primary node, and throws an exception if the primary node is unavailable.
  • primaryPreferred: Prioritizes reading data from the primary node, but reads from a secondary node if the primary node is unavailable.
  • secondary: Prioritizes reading data from a secondary node, and throws an exception if no secondary nodes are available.
  • secondaryPreferred: Prioritizes reading data from a secondary node, but reads from the primary node if no secondary nodes are available.
  • nearest: Reads data from the node closest to the client, including both primary and secondary nodes. This read preference is suitable for scenarios where data consistency is not a concern, but quick data reads are necessary.

When using the cursor.readPref() method, we can pass the read preference as a parameter to the method, for example:

db.collection.find().readPref("secondary")

This tells MongoDB that we want to prioritize reading data from a secondary node.

Conclusion

The cursor.readPref() method can help us better control data reading to meet different application scenarios.