Using MongoDB 2.4.5 I tried the above and got back in both cases the first 2 of your "Should match" results.
I don't believe the 3rd should be returned as it would require ("052049" >= "050600" && "052049" < "052000") or ("052420" < "052000" && "052420" > "050600") neither of which evaluate to true.
MongoDB shell version: 2.4.5
connecting to: test
>
> db.mycol.save({ "start" : "050520", "end" : "051309" })
> db.mycol.save({ "start" : "051125", "end" : "051925" })
> db.mycol.save({ "start" : "052049", "end" : "052420" })
> db.mycol.save({ "start" : "050000", "end" : "050500" })
> db.mycol.save({ "start" : "052100", "end" : "052721" })
>
> db.mycol.find(
... { $or :
... [ { $and : [ { start : { $gte : "050600" } }, { start : { $lt : "052000" } } ] },
... { $and : [ { end : { $lt : "052000" } }, { end : { $gt : "050600" } } ] }
... ]
... } )
{ "_id" : ObjectId("520528522683a40682f12b5c"), "start" : "050520", "end" : "051309" }
{ "_id" : ObjectId("520528522683a40682f12b5d"), "start" : "051125", "end" : "051925" }
>
>
> db.mycol.find(
... { $or :
... [ { $and : [ { end : { $lt : "052000" } }, { end : { $gt : "050600" } } ] } ,
... { $and : [ { start : { $gte : "050600" } }, { start : { $lt : "052000" } } ] }
... ]
... } )
{ "_id" : ObjectId("520528522683a40682f12b5c"), "start" : "050520", "end" : "051309" }
{ "_id" : ObjectId("520528522683a40682f12b5d"), "start" : "051125", "end" : "051925" }
>