summaryrefslogtreecommitdiff
path: root/jstests/core/indexu.js
blob: d1ef13d04684df043954a877322b32752c9fa6b8 (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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Test index key generation with duplicate values addressed by array index and
// object field.  SERVER-2902

t = db.jstests_indexu;
t.drop();

var dupDoc = {a:[{'0':1}]}; // There are two 'a.0' fields in this doc.
var dupDoc2 = {a:[{'1':1},'c']};
var noDupDoc = {a:[{'1':1}]};

// Test that we can't index dupDoc.
assert.writeOK( t.save( dupDoc ));
assert.commandFailed(t.ensureIndex( {'a.0':1} ));

t.remove({});
assert.commandWorked(t.ensureIndex( {'a.0':1} ));
assert.writeError( t.save( dupDoc ));

// Test that we can't index dupDoc2.
t.drop();
assert.writeOK(t.save( dupDoc2 ));
assert.commandFailed(t.ensureIndex( {'a.1':1} ));

t.remove({});
assert.commandWorked(t.ensureIndex( {'a.1':1} ));
assert.writeError(t.save( dupDoc2 ));

// Test that we can index dupDoc with a different index.
t.drop();
t.ensureIndex( {'a.b':1} );
assert.writeOK(t.save( dupDoc ));

// Test number field starting with hyphen.
t.drop();
t.ensureIndex( {'a.-1':1} );
assert.writeOK(t.save( {a:[{'-1':1}]} ));

// Test number field starting with zero.
t.drop();
t.ensureIndex( {'a.00':1} );
assert.writeOK( t.save( {a:[{'00':1}]} ));

// Test multiple array indexes
t.drop();
t.ensureIndex( {'a.0':1,'a.1':1} );
assert.writeOK( t.save( {a:[{'1':1}]} ));
assert.writeError( t.save( {a:[{'1':1},4]} ));

// Test that we can index noDupDoc.
t.drop();
t.save( noDupDoc );
assert.commandWorked(t.ensureIndex( {'a.0':1} ));
assert.commandWorked(t.ensureIndex( {'a.1':1} ));

t.drop();
t.ensureIndex( {'a.0':1} );
t.ensureIndex( {'a.1':1} );
assert.writeOK(t.save( noDupDoc ));

// Test that we can query noDupDoc.
assert.eq( 1, t.find( {'a.1':1} ).hint( {'a.1':1} ).itcount() );
assert.eq( 1, t.find( {'a.1':1} ).hint( {$natural:1} ).itcount() );
assert.eq( 1, t.find( {'a.0':{'1':1}} ).hint( {'a.0':1} ).itcount() );
assert.eq( 1, t.find( {'a.0':{'1':1}} ).hint( {$natural:1} ).itcount() );

// Check multiple nested array fields.
t.drop();
t.save( {a:[[1]]} );
assert.commandWorked(t.ensureIndex( {'a.0.0':1} ));
assert.eq( 1, t.find( {'a.0.0':1} ).hint( {$natural:1} ).itcount() );
assert.eq( 1, t.find( {'a.0.0':1} ).hint( {'a.0.0':1} ).itcount() );

// Check where there is a duplicate for a partially addressed field but not for a fully addressed field.
t.drop();
t.save( {a:[[1],{'0':1}]} );
assert.commandFailed(t.ensureIndex( {'a.0.0':1} ));

// Check where there is a duplicate for a fully addressed field.
t.drop();
assert.writeOK( t.save( {a:[[1],{'0':[1]}]} ));
assert.commandFailed(t.ensureIndex( {'a.0.0':1} ));

// Two ways of addressing parse to an array.
t.drop();
t.save( {a:[{'0':1}]} );
assert.commandFailed(t.ensureIndex( {'a.0.0':1} ));

// Test several key depths - with same arrays being found.
t.drop();
t.save( {a:[{'0':[{'0':1}]}]} );
assert.commandFailed(t.ensureIndex( {'a.0.0.0.0.0.0':1} ));
assert.commandFailed(t.ensureIndex( {'a.0.0.0.0.0':1} ));
assert.commandFailed(t.ensureIndex( {'a.0.0.0.0':1} ));
assert.commandFailed(t.ensureIndex( {'a.0.0.0':1} ));
assert.commandFailed(t.ensureIndex( {'a.0.0':1} ));
assert.commandFailed(t.ensureIndex( {'a.0':1} ));
assert.commandWorked(t.ensureIndex( {'a':1} ));

// Two prefixes extract docs, but one terminates extraction before array.
t.drop();
t.save( {a:[{'0':{'c':[]}}]} );
assert.commandFailed(t.ensureIndex( {'a.0.c':1} ));

t.drop();
t.save( {a:[[{'b':1}]]} );
assert.eq( 1, t.find( {'a.0.b':1} ).itcount() );
t.ensureIndex( {'a.0.b':1} );
assert.eq( 1, t.find( {'a.0.b':1} ).itcount() );