定义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
的别名。
答案 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。