[DRIVERS-653] Require hint for min/max find options Created: 13/May/19  Updated: 28/Oct/23  Resolved: 13/Apr/20

Status: Closed
Project: Drivers
Component/s: None
Fix Version/s: None

Type: Task Priority: Major - P3
Reporter: Rathi Gnanasekaran Assignee: Unassigned
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Depends
depends on SERVER-39567 Query with min/max modifier uses hash... Closed
depends on PYTHON-1811 Raise a deprecation warning for min/m... Closed
depends on CDRIVER-3099 Specify hint with min/max tests for M... Closed
Server Compat: 4.1
Driver Compliance:
Key Status/Resolution FixVersion
CDRIVER-3099 Fixed 1.15.0, 1.14.1
PYTHON-1811 Fixed 3.8

 Description   

Issue

Query with min/max modifier uses first index with related fields.

On fresh MongoDB secondary startup `id` index became last in order (this looks like a bug) and `find` operation with `min`/`max` modifier starts using first hashed index by `_id`.

When this secondary became primary, this shard returns incomplete results on query.

user:PRIMARY> db.socialTopics.getIndices()
[
	{
		"v" : 2,
		"key" : {
			"_id" : "hashed"
		},
		"name" : "_id_hashed",
		"background" : true,
		"ns" : "user.socialTopics"
	},
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_",
		"ns" : "user.socialTopics"
	}
]
user:PRIMARY> db.socialTopics.find({}, {_id: 1}).min({_id: ObjectId("5bb74d8cefa37173fe2cf692")}).sort({_id: 1}).limit(5).explain()
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "user.socialTopics",
		"indexFilterSet" : false,
		"parsedQuery" : {
			
		},
		"winningPlan" : {
			"stage" : "PROJECTION",
			"transformBy" : {
				"_id" : 1
			},
			"inputStage" : {
				"stage" : "SORT",
				"sortPattern" : {
					"_id" : 1
				},
				"limitAmount" : 5,
				"inputStage" : {
					"stage" : "SORT_KEY_GENERATOR",
					"inputStage" : {
						"stage" : "FETCH",
						"inputStage" : {
							"stage" : "IXSCAN",
							"keyPattern" : {
								"_id" : "hashed"
							},
							"indexName" : "_id_hashed",
							"isMultiKey" : false,
							"isUnique" : false,
							"isSparse" : false,
							"isPartial" : false,
							"indexVersion" : 2,
							"direction" : "forward",
							"indexBounds" : {
								
							}
						}
					}
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	...
} 

Why we use min/max modifier

We use min/max modifier for iterating over collections, because MongoDB don't have operation like `after` or `before`.

We can't use `$gt`/`$gte`/`$lt`/`$lte` because:

  1. this operations always false for values with differ types;
  2. it's not trivial to make query with multiple field bounds.

Workaround

Looks like with `hint` we can set correct index directly.


Generated at Thu Feb 08 08:22:02 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.