Saturday, 21 February 2015

Multi key indexes


mongoDB supports indexing keys which values are arrays. These multikey indexes allow MongoDB to return documents from queries using the value of an array.

> db.sample.find()
{ "_id" : ObjectId("54c8f40c889636817c7be6a3"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("54c8f451889636817c7be6a4"), "a" : 3, "b" : 4 }
{ "_id" : ObjectId("54c8f699889636817c7be6a5"), "c" : [ 1, 2, 3, 4 ] }
>
> db.sample.ensureIndex({c:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}
>
> db.sample.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.sample"
        },
        {
                "v" : 1,
                "key" : {
                        "a" : 1,
                        "b" : -1
                },
                "name" : "a_1_b_-1",
                "ns" : "test.sample"
        },
        {
                "v" : 1,
                "key" : {
                        "c" : 1
                },
                "name" : "c_1",
                "ns" : "test.sample"
        }
]


Observe below snippet, (isMultiKey : true), it is using multi key index.

> db.sample.find({c:1}).explain()
{
        "cursor" : "BtreeCursor c_1",
        "isMultiKey" : true,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 1,
        "nChunkSkips" : 0,
        "millis" : 85,
        "indexBounds" : {
                "c" : [
                        [
                                1,
                                1
                        ]
                ]
        },
        "server" : "RENT-MIS-LT3016:27017",
        "filterSet" : false
}


Limitation
MongoDB don’t allow compound indexes multikey compound indexes, at most one field in a compound index may hold an array. For example, given an index on { c: 1, d: 1 }, the document {c:[4,5,6], d:[4,5,6,7,8]} is impermissible. If you attempt to insert such a document, MongoDB will reject the insertion, and produce an error that says cannot index parallel arrays.

> db.sample.ensureIndex({c:1, d:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 3,
        "numIndexesAfter" : 4,
        "ok" : 1
}
>
> db.sample.insert({c:[4,5,6], d:[4,5,6,7,8]})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 10088,
                "errmsg" : "insertDocument :: caused by :: 10088 cannot index parallel arrays [d] [c]"
        }
})
>

Prevoius                                                 Next                                                 Home

No comments:

Post a Comment