使用Mongoose指定索引名称

时间:2017-01-14 04:22:32

标签: mongodb mongoose mongoose-schema

定义Mongoose模式时,通常应谨慎指定应存在哪些索引。也就是说,在许多情况下,我们希望控制创建的索引的名称,尤其是当这些索引是复合的,这样它们是可以理解的。

实际上,在创建某些索引时,需要明确指定索引名称以避免超出index name length limit

由于 ensureIndex (在默认情况下)在模式中定义的索引上调用,因此控制由ensureIndex创建的索引名称的适当语法是什么?我认为使用字段级索引语法是不可能的,但肯定它可用于模式级索引吗?

var ExampleSchema = new Schema({
  a: String,
  b: String,
  c: Date,
  d: Number,
  e: { type: [String], index: true } // Field level index
});

// We define compound indexes in the schema
ExampleSchema.index({a: 1, b: 1, c: 1});
ExampleSchema.index({d:1, e:1}, {unique: true});

值得注意的是db.collection.ensureIndex已被弃用(由mongodb提供),现在是db.collection.createIndex的别名。

2 个答案:

答案 0 :(得分:6)

您可以使用name调用的option参数的index属性设置索引的名称:

ExampleSchema.index({a: 1, b: 1, c: 1}, {name: 'my_index'});
ExampleSchema.index({d:1, e:1}, {name: 'my_other_index', unique: true});

docs所述,index的第二个参数包含:

  

传递给MongoDB驱动程序的createIndex()函数

的选项

createIndex个文档列出了所有可能的选项设置,包括name

答案 1 :(得分:1)

事实证明,Mongoose相当透明地包装了Mongo驱动程序。

因此,对 <Mongoose.Schema>.index(<keys>, <options>) 的调用可粗略地解释为导致对db.collection.ensureIndex(keys, options) db.collection.createIndex(keys, options) 的调用Mongo 3.0 +。

因此,所需的语法(虽然未记录很少)与 schema 索引声明的MongoDB语法相同。

也就是说,我们声明名称如下:

ExampleSchema.index({a: 1, b: 1, c: 1}, {name: "ExampleIndexName_ABC"});
ExampleSchema.index({d:1, e:1}, {unique: true, name: "ExampleCompoundIndexName"});

选项还包括:

  • background
  • unique
  • name
  • partialFilterExpression
  • sparse
  • expireAfterSeconds
  • storageEngine

有关详细信息,请参阅official MongoDB documents