bouncingHippo
bouncingHippo

Reputation: 6040

using ensureIndex in mongodb schema using mongoose

I would like to call ensureIndex on the authorName, what is the command and where in this code should I put it?

var mongoose = require('mongoose');

// defines the database schema for this object
var schema = mongoose.Schema({
    projectName : String,
    authorName : String,
    comment : [{
        id : String,                                    
        authorName : String,
        authorEmailAddress : { type : String, index : true }    
    }]
});

// Sets the schema for model
var ProjectModel = mongoose.model('Project', schema);

// Create a project
exports.create = function (projectJSON) {
    var project = new ProjectModel({
        projectName : projectJSON.projectName,
        authorName : projectJSON.authorName,    

        comment : [{
            id : projectJSON.comments.id,                                           
            authorName : projectJSON.comments.authorName,                           
            authorEmailAddress : projectJSON.authorEmailAddress
        });

        project.save(function(err) {
            if (err) {
                console.log(err);
            } else{
                console.log("success");
            }
        });
    });
}

Upvotes: 11

Views: 25872

Answers (5)

Boanerges
Boanerges

Reputation: 1368

Very simple, in your MongoDB connection add

mongoose.connect(
  process.env.ENVIRON === "production"
    ? process.env.MONGODB_REMOTE
    : process.env.MONGODB_LOCAL,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    autoCreate: true,
    autoIndex: true, // This enables indexing for you
    
  },
  () =>
    console.log(
      `Connected to ${
        process.env.ENVIRON === "production"
          ? "Production DB"
          : "Development DB"
      }`
    )
);

Upvotes: -1

qinggangxu
qinggangxu

Reputation: 179

you can call Schema#index method to create index

let urlSchema = new Schema({
    url: String,
    status: Number
  }
);
urlSchema.index({ url: 1 }, { unique: true, background: true, dropDups: true });

you can listen createing index event.

let UrlModel = mongoose.model('url', urlSchema);
UrlModel.on('index', function(error) {
  if (error && error.message) {
    console.log(`Url collection create index error:${error.message}`);
  }
});

Note: the process of creating index is asynchronous.so when you create unique index,you cannot insert duplicate data. or creating index will fail;

Upvotes: 4

GauravLuthra
GauravLuthra

Reputation: 1035

First define index on authorName field and if you manually want invoke ensureIndex because of certain requirement then you have to set autoIndex to false. This is what your schema would look like:

var schema = mongoose.Schema({
    projectName : String,
    authorName : {type : String, index : true}
    comment : [{
        id : String,                                    
        authorName : String,
        authorEmailAddress : { type : String, index : true }    
    }]
}, {
     // Turn-off auto indexing, we manually need to trigger indexing 
     autoIndex : false 
});

And based on the requirement you can invoke ensureIndexes method on the model that you have created using this schema i.e. ProjectModel.ensureIndexes();

Upvotes: 1

FelikZ
FelikZ

Reputation: 3077

You could use this statement:

mongoose.connection.collections['my_collection'].ensureIndex({ "key": 1 }, { "unique": true }, callback);

For example you want to do some integration tests, so you will need to drop your collections rapidly. In that case mongoose doesn't setup indexes again during runtime even if option autoIndex is set to true. This answer could be useful in that case.

Upvotes: 14

JohnnyHK
JohnnyHK

Reputation: 311835

You don't call ensureIndex directly, you indicate that field should be indexed in your schema like this:

var schema = mongoose.Schema({
  projectName : String,
  authorName : { type: String, index: true }
});

Based on that definition, Mongoose will call ensureIndex for you when you register the model via the mongoose.model call.

To see the ensureIndex calls that Mongoose is making, enable debug output by adding the following to your code:

mongoose.set('debug', true);

Upvotes: 33

Related Questions