我有多个软件实例从同一个Mongodb实例写入/读取,我需要确保在T期内只插入一个值为字段Y的文档。
我一直在想弄清楚如何实现这一点,我已经阅读了这个post并且我理解Mongodb锁定db直到当前写入完成,但这不足以保证目标。
我期待发生的情景如下所示:
结果将是一个重复的文件。
我认为一个解决方案可能是锁定数据库"读取Mongodb"直到"写信给Mongodb"步骤,但我不确定是否可以使用Mongodb。
更新
如果插入了第一个文件,其中第一个文件的字段Y的值为X,则可以使用重复的文件。
答案 0 :(得分:1)
您可以尝试在字段Y上添加唯一索引 - 在您的情况下,第二个实例在创建文档时会出错,因为字段Y的值X文档已经存在。
制作索引:(more here)
db.yourCollection.createIndex( { "Y": 1 }, { unique: true } )
//问题更新后的评论
在那种情况下我提供的解决方案是不够的。
可能会起作用的是添加保留上次更新时间戳的字段(让我们称之为updated_at
)以及稍后运行upsert命令,同时考虑updated_at
和Y
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_at
和Y
上的索引具有高性能