[DOCS-11476] Docs for SERVER-23202: Query planner does not trim certain bounds-generating inequality predicates from expression tree Created: 21/Mar/18  Updated: 27/Oct/23  Resolved: 23/Mar/18

Status: Closed
Project: Documentation
Component/s: None
Affects Version/s: None
Fix Version/s: 3.7.4

Type: Task Priority: Major - P3
Reporter: Kay Kim (Inactive) Assignee: Unassigned
Resolution: Gone away Votes: 0
Labels: asya
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Documented
documents SERVER-23202 Query planner does not trim certain b... Closed
Participants:
Days since reply: 5 years, 46 weeks, 5 days ago
Epic Link: DOCS: 4.0 Server

 Description   

Documentation Request Summary:

Please discuss with Nicholas about whether changes are necessary or not.

Engineering Ticket Description:

The query planner does not trim bounds-generating inequality predicates from the expression tree, when the value being compared to is one of the following BSON types:

  • Object
  • Undefined
  • RegEx
  • DBRef
  • Code
  • Symbol
  • CodeWScope

As a result, such predicates are not eligible for covering behavior, and require an unnecessary additional match operation after the document is fetched from disk.

Reproduce as follows:

> db.foo.drop()
true
> db.foo.ensureIndex({a:1})
{
	"createdCollectionAutomatically" : true,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
> db.foo.find({a:{$gte:function(){ return 0; }}}).explain('queryPlanner').queryPlanner.winningPlan
{
	"stage" : "FETCH",  // Unexpected: FETCH does not need a filter with $gte predicate here.
	"filter" : {
		"a" : {
			"$gte" : function (){ return 0; }
		}
	},
	"inputStage" : {
		"stage" : "IXSCAN",
		"keyPattern" : {
			"a" : 1
		},
		"indexName" : "a_1",
		"isMultiKey" : false,
		"isUnique" : false,
		"isSparse" : false,
		"isPartial" : false,
		"indexVersion" : 1,
		"direction" : "forward",
		"indexBounds" : {
			"a" : [
				"[function (){ return 0; }, CodeWScope( , {}))"
			]
		}
	}
}
> db.foo.find({a:{$eq:function(){ return 0; }}}).explain('queryPlanner').queryPlanner.winningPlan
{
	"stage" : "FETCH",  // Expected: No filter with $eq predicate here.
	"inputStage" : {
		"stage" : "IXSCAN",
		"keyPattern" : {
			"a" : 1
		},
		"indexName" : "a_1",
		"isMultiKey" : false,
		"isUnique" : false,
		"isSparse" : false,
		"isPartial" : false,
		"indexVersion" : 1,
		"direction" : "forward",
		"indexBounds" : {
			"a" : [
				"[function (){ return 0; }, function (){ return 0; }]"
			]
		}
	}
}
>



 Comments   
Comment by Allison Reinheimer Moore [ 23/Mar/18 ]

Confirmed that server-side tweak to query planner implementation does not require docs changes.

Comment by Allison Reinheimer Moore [ 22/Mar/18 ]

Commented on SERVER-23202 to check if docs changes are actually needed.

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