如何通过mongoose在mongodb中设置复合主键

我想通过mongoosemongodb中为集合中的两个字段设置主键。 我知道在mongodb设置复合主键为

 db.yourcollection.ensureIndex( { fieldname1: 1, fieldname2: 1 }, { unique: true } ) 

但我正在使用mongoose来处理mongodb我不知道如何从mongoose设置复合主键

更新

我使用了mySchema.index({ ColorScaleID: 1, UserName: 1}, { unique: true }); 看我的代码

 var mongoose = require('mongoose') var uristring ='mongodb://localhost/fresh'; var mongoOptions = { db: { safe: true } }; // Connect to Database mongoose.connect(uristring, mongoOptions, function (err, res) { if (err) { console.log ('ERROR connecting to: remote' + uristring + '. ' + err); } else { console.log ('Successfully connected to: remote' + uristring); } }); var mySchema = mongoose.Schema({ ColorScaleID:String, UserName:String, Range1:Number, }) mySchema.index({ ColorScaleID: 1, UserName: 1}, { unique: true }); var freshtime= mongoose.model("FreshTimeColorScaleInfo",mySchema) var myVar = new freshtime({ ColorScaleID:'red', UserName:'tab', Range1:10 }) myVar.save() mongoose.connection.close(); 

当我第一次执行这个代码时,我在mongodb的新数据库中看到一行{"_id":...,ColorScaleID:'red',UserName:'tab',Range1:10 } 。 当我第二次执行相同的代码时,我看到两个相同的行。

 {"_id":...,ColorScaleID:'red',UserName:'tab',Range1:10 } {"_id":...,ColorScaleID:'red',UserName:'tab',Range1:10 } 

如果composite primary key工作,那么它不应该允许我再次插入相同的数据。 会有什么问题?

你定义你的模式的方式是正确的,将工作。 你可能遇到的是数据库已经被创build,并且该集合可能已经存在,即使它可能是空的。 mongoose不会适合这个指数。

作为一个实验,将您的数据库设置为不存在的数据库。 例如:

 var uristring ='mongodb://localhost/randomname'; 

然后尝试对这个数据库运行这两行,看看你是否仍然可以插入这两个文件。

然后比较每个集合中的“system.indexes”集合的内容。 你应该看到,randomname db的组合索引正确设置。

正如大家所说,你必须使用Schema的索引方法来设置复合唯一键。 但是这还不够,请尝试重新启动MongoDB。

也许你可以在你的mongoose模式模式中试试这个,

 const AppSchema1 = new Schema({ _id :{appId:String, name:String}, name : String });