如何确保Mongodb中只存在一个具有X值的文档

时间:2018-06-12 06:53:41

标签: c# .net mongodb

我有多个软件实例从同一个Mongodb实例写入/读取,我需要确保在T期内只插入一个值为字段Y的文档。

我一直在想弄清楚如何实现这一点,我已经阅读了这个post并且我理解Mongodb锁定db直到当前写入完成,但这不足以保证目标。

我期待发生的情景如下所示:

Diagram

结果将是一个重复的文件。

我认为一个解决方案可能是锁定数据库"读取Mongodb"直到"写信给Mongodb"步骤,但我不确定是否可以使用Mongodb。

更新

如果插入了第一个文件,其中第一个文件的字段Y的值为X,则可以使用重复的文件。

1 个答案:

答案 0 :(得分:1)

您可以尝试在字段Y上添加唯一索引 - 在您的情况下,第二个实例在创建文档时会出错,因为字段Y的值X文档已经存在。

制作索引:(more here

db.yourCollection.createIndex( { "Y": 1 }, { unique: true } )

//问题更新后的评论

在那种情况下我提供的解决方案是不够的。 可能会起作用的是添加保留上次更新时间戳的字段(让我们称之为updated_at)以及稍后运行upsert命令,同时考虑updated_atY

db.yourCollection.update(
  {
    updated_at: {
        $gte: ISODate("2018-06-01T00:00:00.000Z"),
        $lt: ISODate("2018-06-01T01:00:00.000Z") # one hour interval
    },
    Y: {
      $exists: false
    }
  },
  {
    upsert: true
  }
)

请注意,当集合增长时,集合将要求updated_atY上的索引具有高性能