MongoDB:确保只有一个文档可以将字段设置为 true

cor*_*vid 6 javascript mongodb meteor

我有一个具有多种配置的 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);
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

然而,我面临的问题是,理论上,该集合中的多个项目可以将布尔值设置activetrue

在MongoDB中,有什么办法可以防止这种情况发生吗?有什么方法可以确保集合中只有一个文档的标志设置为 true,而所有其他文档都将其设置为 false?

Ale*_*lex 2

active删除错误的标志值后,您可以在标志上添加唯一的稀疏索引。这将确保只有一个文档可以将active标志设置为 true(或 false)。

db.CylonConfigurations.createIndex( { "active": 1 }, { sparse: true,unique: true } )
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建一个新集合,仅存储ObjectId当前活动配置的,例如在名为 的字段中ActiveConfigurationId。在此模型中,您只需更新此字段即可更改活动配置。