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

How can I set composite primary key in mongodb through mongoose

本文关键字:设置 复合 mongodb 何通过 mongoose      更新时间:2023-09-26

我想在mongodbmongoose中为集合中的两个字段设置主键。我知道在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有效,那么它不应该允许我第二次插入相同的数据。会有什么问题?

您定义模式的方式是正确的,并且会起作用。您可能遇到的情况是,数据库已经创建,并且该集合可能已经存在,即使它可能是空的。Mongoose不符合索引。

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

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

然后试着对这个数据库运行这两行,看看是否还能插入这两个文档。

然后比较每个集合中"system.indexes"集合的内容。您应该看到randomname数据库正确设置了复合索引。

正如大家提到的,您必须使用Schema的index方法来设置复合唯一键。但这还不够,之后尝试重新启动MongoDB。

也许你可以在你的猫鼬模式模型中尝试一下

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