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

MongoDB: Ensure that only one document can have a field set to true

本文关键字:字段 设置 true 确保 有一个 文档 MongoDB      更新时间:2023-09-26

我有一个具有多种配置的 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?

删除

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

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

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

我们可以使用 partialFilterExpression,我们可以在其中仅过滤活动状态文档并设置唯一 true,这将确保在任何给定时刻只有一个文档处于活动状态。这将有助于克服稀疏类型解决方案的限制。

.db。CylonConfigurations.createIndex({"status":1},{unique:true, partialFilterExpression: {status : "Active"}})