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

时间:2016-02-18 14:51:28

标签: 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);
      }
    });
  }
});

但是,我遇到的问题是这个集合中的多个项目理论上可以将active的布尔值设置为true

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

1 个答案:

答案 0 :(得分:2)

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

db.CylonConfigurations.createIndex( { "active": 1 }, { sparse: true,unique: true } )

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