Details
-
Bug
-
Resolution: Duplicate
-
Major - P3
-
None
-
2.3.0
-
None
-
Ubuntu 12.04 LTS
-
Fully Compatible
-
ALL
Description
Implement the SERVER-3104 optimization for dotted field cases where it can be supported. Note that it cannot be supported in some cases such as the following:
// Cases with double dotted index field names.
|
t.drop();
|
index = { 'a.b.x':1, 'a.b.y':1 };
|
t.ensureIndex( index );
|
t.save( { a:{ b:{ x:1, y:1 } } } );
|
t.save( { a:[ { b:{ x:1 } }, { b:{ y:1 } } ] } );
|
t.save( { a:[ { b:[ { x:1 }, { y:1 } ] } ] } );
|
t.save( { a:[ { b:[ { x:1, y:1 } ] } ] } );
|
assert.eq( 4, t.count() );
|
// No $elemMatch.
|
assertResultsAndIndexBounds( { 'a.b.x':[[ 1, 1 ]], 'a.b.y':[[ MIN, MAX ]] },
|
{ 'a.b.x':1, 'a.b.y':1 } );
|
// $elemMatch with dotted children.
|
assertResultsAndIndexBounds( { 'a.b.x':[[ 1, 1 ]], 'a.b.y':[[ MIN, MAX ]] },
|
{ a:{ $elemMatch:{ 'b.x':1, 'b.y':1 } } } );
|
// $elemMatch with undotted children.
|
assertResultsAndIndexBounds( { 'a.b.x':[[ 1, 1 ]], 'a.b.y':[[ 1, 1 ]] },
|
{ 'a.b':{ $elemMatch:{ x:1, y:1 } } } );
|
Aaron
-----------------------------------------------------------
the SERVER-3104 optimization will not work correctly when there are dotted fields within a $elemMatch expression
|
db.test.insert({"code" : "000001", doc : [ {"code1" : "000001", "type" : { "subtype" : [ "1" ,"3" ]}}]});
|
db.test.insert({"code" : "000002", doc : [ {"code1" : "000001", "type" : { "subtype" : [ "1" ]}}]});
|
db.test.insert({"code" : "000003", doc : [ {"code1" : "000001", "type" : { "subtype" : [ "1", "2"] }}]});
|
db.test.insert({"code" : "000004", doc : [ {"code1" : "000001", "type" : { "subtype" : [ "2" ]}}, {"code1" : "000002", "type" : { "subtype" : [ "3" ]}} ]});
|
db.test.insert({"code" : "000005", doc : [ {"code1" : "000001", "type" : { "subtype" : [ ]}}]});
|
db.test.insert({"code" : "000006", doc : [ {"code1" : "000001", "type" : { "subtype" : [ "3" ]}}]});
|
db.test.insert({"code" : "000007", doc : [ {"code1" : "000001" }]});
|
|
db.test.insert({"code" : "000001", doc : [ {"code1" : "000002", "type" : { "subtype" : [ "1" ,"3" ]}}]});
|
db.test.insert({"code" : "000002", doc : [ {"code1" : "000002", "type" : { "subtype" : [ "1" ]}}]});
|
db.test.insert({"code" : "000003", doc : [ {"code1" : "000002", "type" : { "subtype" : [ "1", "2"] }}]});
|
db.test.insert({"code" : "000004", doc : [ {"code1" : "000002", "type" : { "subtype" : [ "2" ]}}, {"code1" : "000001", "type" : { "subtype" : [ "3" ]}} ]});
|
db.test.insert({"code" : "000005", doc : [ {"code1" : "000002", "type" : { "subtype" : [ ]}}]});
|
db.test.insert({"code" : "000006", doc : [ {"code1" : "000002", "type" : { "subtype" : [ "3" ]}}]});
|
db.test.insert({"code" : "000007", doc : [ {"code1" : "000002" }]});
|
|
db.test.insert({"code" : "000001", doc : [ {"code1" : "000003", "type" : { "subtype" : [ "1" ,"3" ]}}]});
|
db.test.insert({"code" : "000002", doc : [ {"code1" : "000003", "type" : { "subtype" : [ "1" ]}}]});
|
db.test.insert({"code" : "000003", doc : [ {"code1" : "000003", "type" : { "subtype" : [ "1", "2"] }}]});
|
db.test.insert({"code" : "000004", doc : [ {"code1" : "000003", "type" : { "subtype" : [ "2" ]}}]});
|
db.test.insert({"code" : "000005", doc : [ {"code1" : "000003", "type" : { "subtype" : [ ]}}]});
|
db.test.insert({"code" : "000006", doc : [ {"code1" : "000003", "type" : { "subtype" : [ "3" ]}}]});
|
db.test.insert({"code" : "000007", doc : [ {"code1" : "000003" }]});
|
db.test.ensureIndex( { "doc.code1": 1, "doc.type.subtype": -1, "code": -1 }, { unique: false, sparse: false, background: true, name: "index_test"} )
|
|
db.test.find( { "doc" : { "$elemMatch" : { "code1" : { "$in" :[ "000001", "000003" ] }, "type.subtype" : "2" } } } ).explain()
|
{
|
"cursor" : "BtreeCursor index_test multi",
|
"isMultiKey" : true,
|
"n" : 4,
|
"nscannedObjects" : 19,
|
"nscanned" : 20,
|
"nscannedObjectsAllPlans" : 39,
|
"nscannedAllPlans" : 40,
|
"scanAndOrder" : false,
|
"indexOnly" : false,
|
"nYields" : 0,
|
"nChunkSkips" : 0,
|
"millis" : 0,
|
"indexBounds" : {
|
"doc.code1" : [
|
[
|
"000001",
|
"000001"
|
],
|
[
|
"000003",
|
"000003"
|
]
|
],
|
"doc.type.subtype" : [
|
[
|
{
|
"$maxElement" : 1
|
},
|
{
|
"$minElement" : 1
|
}
|
]
|
],
|
"code" : [
|
[
|
{
|
"$maxElement" : 1
|
},
|
{
|
"$minElement" : 1
|
}
|
]
|
]
|
},
|
"server" : "xxx:27017"
|
}
|
Attachments
Issue Links
- duplicates
-
SERVER-10026 New query system
-
- Closed
-
- is related to
-
SERVER-3104 index bound improvements for elemMatch query on multikey index
-
- Closed
-
-
SERVER-7354 Index with enbedded document
-
- Closed
-