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