我有一个包含多个配置的mongo集合。但是,在任何时候,只有其中一个可以“活跃”。我这样做是将active
标记设置为true。
CylonConfigurations = new Mongo.Collection('cylon_configurations');
Meteor.startup(function () {
if (Meteor.isServer) {
CylonConfigurations.upsert({
host: '192.168.1.4',
port: 23
}, {
$setOnInsert: {
host: '192.168.1.4',
port: 23,
active: true
}
}, function (err, s) {
if (!err) {
const conn = CylonConfigurations.findOne({ active: true });
Cylon.connect(conn.port, conn.host);
}
});
}
});
但是,我遇到的问题是这个集合中的多个项目理论上可以将active
的布尔值设置为true
。
在MongoDB中,有什么方法可以防止这种情况发生吗?有没有办法确保集合中只有一个文档的标志设置为true,而其他所有文档都设置为false?
答案 0 :(得分:2)
删除错误的标志值后,您可以在active
标志上添加唯一的稀疏索引。这将确保只有一个文档可以将active
标志设置为true(或false)。
db.CylonConfigurations.createIndex( { "active": 1 }, { sparse: true,unique: true } )
或者,您可以创建一个仅存储当前活动配置的ObjectId
的新集合,例如在名为ActiveConfigurationId
的字段中。在此模型中,您只需更新此字段即可更改活动配置。