Mr. Demetrius Michael
Mr. Demetrius Michael

Reputation: 2406

How to Create a nested index in MongoDB?

A. How do I index nested and all of it's values?

B. How do I index valuetwo?

{
    id: 00000,
    attrs: {
        nested:{
            value: value1,
            valuetwo: value2,
        }
    }
}

I've looked here: http://www.mongodb.org/display/DOCS/Indexes, and the docs to my knowledge, aren't clear about indexing things that aren't nested.

Upvotes: 71

Views: 53583

Answers (4)

eBoody
eBoody

Reputation: 171

It looks like there may have been a new feature to address this since these answers have been written.

Mongodb has wildcard indexes that allow you to create an index for a field that contains varying keys.

From the documentation:

If the field is a nested document or array, the wildcard index recurses into the document/array and indexes all scalar fields in the document/array.

So the index in the question would be constructed like this:

db.collections.createIndex({ "attrs.nested.$**": 1 })

You can read more about this here!

The previous answers nearly gave me a heart attack.

Upvotes: 2

Bryan Migliorisi
Bryan Migliorisi

Reputation: 9220

You'd create them just as if you were creating an index on a top level field:

db.collection.createIndex({"attrs.nested.value": 1})

You do need to explicitly create indexes on each field.

Upvotes: 119

Arun Pratap Singh
Arun Pratap Singh

Reputation: 3666

MongoDB automatically creates a multikey index if any indexed field is an array; you do not need to explicitly specify the multikey type.

This will work for both the scenario's

db.coll.createIndex( { "addr.pin": 1 } )

Scenario 1 nested OBJECTS

{
  userid: "1234",
  addr: {
    pin:"455522"
  }
},
{
  userid: "1234",
  addr: {
    pin:"777777"
  }
}

Scenario 2 nested Arrays

{
  userid: "1234",
  addr: [
    { pin:"455522" },
    { pin:"777777" },
  ]
}

https://docs.mongodb.com/manual/core/index-multikey/

Upvotes: 16

cianmce
cianmce

Reputation: 494

A. to index all the properties in "nested" you will have to index them separately:

db.collection.createIndex({"attrs.nested.value": 1});
db.collection.createIndex({"attrs.nested.valuetwo": 1});

This can be done in one command with:

db.collection.createIndexes([{"attrs.nested.value": 1}, {"attrs.nested.valuetwo": 1}]);

B. to index just "valuetwo":

db.collection.createIndex({"attrs.nested.valuetwo": 1})

Use createIndex over ensureIndex as ensureIndex is Deprecated since version 3.0.0

Upvotes: 13

Related Questions