我想在mongodb
到mongoose
的集合中为两个字段设置主键。我知道在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
有效,则不应允许我第二次插入相同的数据。会有什么问题?
答案 0 :(得分:1)
您定义架构的方式是正确的并且可行。您可能遇到的是数据库已经创建,并且该集合可能已经存在,即使它可能是空的。猫鼬不会适合指数。
作为实验,将数据库设置为不存在的数据库。 e.g:
var uristring ='mongodb://localhost/randomname';
然后尝试针对此数据库运行这两行,看看是否仍然可以插入这两个文档。
然后比较每个集合中“system.indexes”集合的内容。您应该看到随机名称db已正确设置了复合索引。
答案 1 :(得分:0)
正如大家所提到的,你必须使用Schema的索引方法来设置复合唯一键。 但这还不够,请在此之后尝试重启MongoDB。
答案 2 :(得分:0)
可能你可以在你的mongoose架构模型中尝试这个,
const AppSchema1 = new Schema({
_id :{appId:String, name:String},
name : String
});