summaryrefslogtreecommitdiff
path: root/jstests/core/idhack.js
blob: 307a048ef2bb5fc3de9478b46bc354c480df5844 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

t = db.idhack
t.drop()


t.insert( { _id : { x : 1 } , z : 1 } )
t.insert( { _id : { x : 2 } , z : 2 } )
t.insert( { _id : { x : 3 } , z : 3 } )
t.insert( { _id : 1 , z : 4 } )
t.insert( { _id : 2 , z : 5 } )
t.insert( { _id : 3 , z : 6 } )

assert.eq( 2 , t.findOne( { _id : { x : 2 } } ).z , "A1" )
assert.eq( 2 , t.find( { _id : { $gte : 2 } } ).count() , "A2" )
assert.eq( 2 , t.find( { _id : { $gte : 2 } } ).itcount() , "A3" )

t.update( { _id : { x : 2 } } , { $set : { z : 7 } } )
assert.eq( 7 , t.findOne( { _id : { x : 2 } } ).z , "B1" )

t.update( { _id : { $gte : 2 } } , { $set : { z : 8 } } , false , true )
assert.eq( 4 , t.findOne( { _id : 1 } ).z , "C1" )
assert.eq( 8 , t.findOne( { _id : 2 } ).z , "C2" )
assert.eq( 8 , t.findOne( { _id : 3 } ).z , "C3" )

// explain output should show that the ID hack was applied.
var query = { _id : { x : 2 } };
var explain = t.find( query ).explain( true );
print( "explain for " + tojson( query , "" , true ) + " = " + tojson( explain ) );
assert.eq( 1 , explain.n , "D1" );
assert.eq( 1 , explain.nscanned , "D2" );
assert.neq( undefined , explain.cursor , "D3" );
assert.neq( "" , explain.cursor , "D4" );
assert.neq( undefined , explain.indexBounds , "D5" );
assert.neq( {} , explain.indexBounds , "D6" );

// ID hack cannot be used with hint().
var query = { _id : { x : 2 } };
var explain = t.find( query ).explain();
t.ensureIndex( { _id : 1 , a : 1 } );
var hintExplain = t.find( query ).hint( { _id : 1 , a : 1 } ).explain();
print( "explain for hinted query = " + tojson( hintExplain ) );
assert.neq( explain.cursor, hintExplain.cursor, "E1" );

// ID hack cannot be used with skip().
var skipExplain = t.find( query ).skip(1).explain();
print( "explain for skip query = " + tojson( skipExplain ) );
assert.neq( explain.cursor, skipExplain.cursor, "F1" );