复合指标不工作?
我正在尝试使用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是不把我的数据库放在我的导入脚本中,而是遍历我的模型并删除所有的文档。 这样数据就被销毁了,但是索引依然存在,因此复合指数就可以工作。