[SERVER-9547] min() / max() with descending order sort not working Created: 03/May/13  Updated: 27/Jan/15  Resolved: 27/Jan/15

Status: Closed
Project: Core Server
Component/s: Querying
Affects Version/s: 2.4.3, 2.4.7
Fix Version/s: None

Type: Bug Priority: Major - P3
Reporter: Thomas Rueckstiess Assignee: Ian Whalen (Inactive)
Resolution: Duplicate Votes: 3
Labels: query_triage
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: File server9547.js    
Issue Links:
Depends
depends on SERVER-3766 Assertion failure la <= 0xffffff db/b... Closed
depends on SERVER-10026 New query system Closed
Duplicate
duplicates SERVER-15015 Assertion failure when combining $max... Closed
is duplicated by SERVER-9540 How to get the previous mongoDB docum... Closed
Related
related to SERVER-15015 Assertion failure when combining $max... Closed
is related to SERVER-17076 Consider removing IndexBounds::isSimp... Closed
Operating System: ALL
Participants:

 Description   

Setting the .min() or .max() explicitly on a find and using a descending sort seems not to work.

> db.docs.drop()
> for (var i=0; i<10; i++) { db.docs.insert({number: i}) }
> db.docs.ensureIndex({number: 1})

no sort

> db.docs.find().max({number: 4})
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e3"), "number" : 0 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e4"), "number" : 1 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e5"), "number" : 2 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e6"), "number" : 3 }

ascending sort

> db.docs.find().max({number: 4}).sort({number: 1})
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e3"), "number" : 0 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e4"), "number" : 1 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e5"), "number" : 2 }
{ "_id" : ObjectId("51834d678d284e5c5e3ea7e6"), "number" : 3 }

descending sort

> db.docs.find().max({number: 4}).sort({number: -1})
> 

I would expect to get the 4 documents back in the 'reverse order' case, in number order: 3, 2, 1, 0. Instead, I get 0 documents back.

explain of ascending sort

> db.docs.find().max({number: 4}).sort({number: 1}).explain()
{
	"cursor" : "BtreeCursor number_1",
	"isMultiKey" : false,
	"n" : 4,
	"nscannedObjects" : 4,
	"nscanned" : 4,
	"nscannedObjectsAllPlans" : 4,
	"nscannedAllPlans" : 4,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"start" : {
			"number" : {
				"$minElement" : 1
			}
		},
		"end" : {
			"number" : 4
		}
	},
	"server" : "capslock.local:27017"
}

explain of descending sort

> db.docs.find().max({number: 4}).sort({number: -1}).explain()
{
	"cursor" : "BtreeCursor number_1 reverse",
	"isMultiKey" : false,
	"n" : 0,
	"nscannedObjects" : 0,
	"nscanned" : 0,
	"nscannedObjectsAllPlans" : 0,
	"nscannedAllPlans" : 0,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 0,
	"indexBounds" : {
		"start" : {
			"number" : {
				"$minElement" : 1
			}
		},
		"end" : {
			"number" : 4
		}
	},
	"server" : "capslock.local:27017"
}



 Comments   
Comment by David Storch [ 27/Jan/15 ]

This was fixed as part of SERVER-15015 in commit f02059e07733. The fix was also backported to the 2.6 branch:

> db.version()
2.6.7
> db.docs.drop()
false
> for (var i=0; i<10; i++) { db.docs.insert({number: i}) }
WriteResult({ "nInserted" : 1 })
> db.docs.ensureIndex({number: 1})
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"ok" : 1
}
> db.docs.find().max({number: 4}).sort({number: -1})
{ "_id" : ObjectId("54c80b68df35352079babd4c"), "number" : 4 }
{ "_id" : ObjectId("54c80b68df35352079babd4b"), "number" : 3 }
{ "_id" : ObjectId("54c80b68df35352079babd4a"), "number" : 2 }
{ "_id" : ObjectId("54c80b68df35352079babd49"), "number" : 1 }
{ "_id" : ObjectId("54c80b67df35352079babd48"), "number" : 0 }

The fact that {number: 4} is included in this output is due to a known issue caused when reversing index bounds that are represented as a "simple range": see https://github.com/mongodb/mongo/blob/r3.0.0-rc6/src/mongo/db/query/query_planner_common.cpp#L45-L50. The fix for this existing issue will fall out of SERVER-17076.

Closing as a duplicate of SERVER-15015 and linking to SERVER-17076.

Comment by Benety Goh [ 04/Dec/13 ]

min/max

Comment by Benety Goh [ 08/Nov/13 ]

Hi George,

The server crash you mentioned has been fixed in our 2.4 release.

Ben

Comment by George Thompson [ 06/May/13 ]

FWIW, on my setup (Windows 7 64 bit SP1 & mongoDB 2.2.0)

db.docs.find().max({number: 4}).sort({number: -1})

crashes the mongoDB server with:

Mon May 06 09:21:32 [conn1]  PAY.docs Assertion failure la <= 0xffffff c:\mongodb\src\mongo\db\btree.h 243
...
Mon May 06 09:21:33 [conn1] *** unhandled exception 0x80000003 at 0x000007FEFDF03172, terminating

Generated at Thu Feb 08 03:20:45 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.