如何以原子方式将条目添加到MongoDB数组中

时间:2013-09-11 16:34:03

标签: python mongodb atomic

我有多个发布/订阅服务器,它们会在事件发生时尝试更新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"
}

是否有人能成功地在文档中原子地添加/修改数组条目而无需将数组数据完全移出集合?我知道通过将它移出集合,它允许我对条目建立一个独特的约束,但我宁愿不必这样做。

1 个答案:

答案 0 :(得分:0)

不幸的是,您需要将数组移动到它自己的集合中,以对uuid强制执行唯一约束,这将导致具有相同uuid的插入失败。有一个功能请求提供,您可以在https://jira.mongodb.org/browse/SERVER-1068找到。

如果我可以帮助您,请告诉我。

最佳, 查理