复合指标不工作?

我正在尝试使用mongoose创build一个复合索引:

var ProjectSchema = new mongoose.Schema({ name: {type: String, required: true}, user: {type: mongoose.Schema.ObjectId, ref: 'User', required: true} }); ProjectSchema.index({user: 1, name: 1}, {unique: true}); 

之后,我放下了mongo的旧数据库

 db.dropDatabase() 

但我仍然可以插入具有相同名称和用户标识的多个文档。 为什么?

它创build的索引显示为mongo

 > db.projects.getIndexes(); [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "mydatabase.projects", "name" : "_id_" } ] 

其实你的索引似乎并没有被创build。 您只显示默认的主键。 .getIndexes()输出应该更像:

 > db.projects.getIndexes() [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "project.projects", "name" : "_id_" }, { "v" : 1, "key" : { "user" : 1, "name" : 1 }, "unique" : true, "ns" : "project.projects", "name" : "user_1_name_1", "background" : true, "safe" : null } ] 

你的代码中可能有些东西,但这对我有用:

 var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/project'); var db = mongoose.connection; var Schema = mongoose.Schema; var UserSchema = new Schema({ name: { type: String, required: true }, info: String }); var ProjectSchema = new Schema({ name: { type: String, required: true}, user: { type: Schema.ObjectId, ref: 'User', required: 'true'} }); ProjectSchema.index({ user: 1, name: 1}, { unique: true }); var User = mongoose.model( "User", UserSchema ); var Project = mongoose.model( "Project", ProjectSchema ); var user = new User({ name: "me" }); user.save(function(){ var project = new Project({ name: "Project1", user: user._id }); project.save(function(err, project, numAffected){ if (err) { // Should be fine console.log(err); } console.log("First project created"); User.findOne({}).exec(function(err, user) { console.log(user._id); var project = new Project({ name: "Project1", user: user._id }); project.save(function(err, project, numAffected){ if (err) { console.log(err); // Expect a problem here } console.log({ project: project, num: numAffected }); }); }); }); }); 

这是纯mongo控制台function,它的工作原理,点击这里获取更多的细节。 这不是在mongoose的API descibe。 我认为这可能是工作。

 db.collection.ensureIndex( { a: 1 }, { unique: true, dropDups: true } ) 

我有完全相同的问题, 这个Github问题解释发生了什么。

首先,只有在ensureIndex()之后才会创build复合索引。 对我来说,问题是我正在使用一个导入脚本来放弃我的数据库并重新创build它。 在重新启动服务器之前,不会调用ensureIndex() ,因此在此之后不会重新创build复合索引。

对我来说,解决scheme是不把我的数据库放在我的导入脚本中,而是遍历我的模型并删除所有的文档。 这样数据就被销毁了,但是索引依然存在,因此复合指数就可以工作。