我有多个发布/订阅服务器,它们会在事件发生时尝试更新MongoDB数据库。目前我遇到了一个问题,我需要以原子方式将条目添加到给定的MongoDB文档数组中,但是当涉及到谁将条目添加到文档中时,我遇到了竞争条件。我试图使用$addToSet
来完成添加。但是,由于数组条目一旦条目在数组中就可以更新,因此addToSet很难正常工作,因为它会直接比较以查看条目是否在数组中。最终结果如下所示,我得到多个服务器在数组的新条目中添加。
以下是我想要的完成文档的示例:
{
"_id" : ObjectId("522f99a622927d6d65b81dbd"),
"array" : [
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
}
],
"created" : ISODate("2013-09-10T17:13:58.437Z"),
"name" : "entry"
}
下面是一个由于竞争条件而发生的事情的例子:
{
"_id" : ObjectId("522f99a622927d6d65b81dbd"),
"array" : [
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
},
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
}
],
"created" : ISODate("2013-09-10T17:13:58.437Z"),
"name" : "entry"
}
是否有人能成功地在文档中原子地添加/修改数组条目而无需将数组数据完全移出集合?我知道通过将它移出集合,它允许我对条目建立一个独特的约束,但我宁愿不必这样做。
答案 0 :(得分:0)
不幸的是,您需要将数组移动到它自己的集合中,以对uuid强制执行唯一约束,这将导致具有相同uuid的插入失败。有一个功能请求提供,您可以在https://jira.mongodb.org/browse/SERVER-1068找到。
如果我可以帮助您,请告诉我。
最佳, 查理