MongoDB更新多个文档

MongoDB更新多个文档,mongodb,transactions,Mongodb,Transactions,模式: 有“a”: 及“b”: 如果我更新a.available=false,我应该同时更新b.available=false。 如何更新两个文档并确保在更新“a”和“b”之间不会有其他进程/线程获取“b”。MongoDB不支持原子事务。因此,如果您需要在第二次更新失败时使第一次更新“撤消自身”,那么您就不走运了 但是,在某些有限的情况下,MongoDB确实支持独立更新。更新不是全部或没有,但是MangGDB将保证没有人在写的中间向集合写入。 几个主要的注意事项: 所有文档必须在同一个集合中

模式:

有“a”:

及“b”:

如果我更新a.available=false,我应该同时更新b.available=false。
如何更新两个文档并确保在更新“a”和“b”之间不会有其他进程/线程获取“b”。

MongoDB不支持原子事务。因此,如果您需要在第二次更新失败时使第一次更新“撤消自身”,那么您就不走运了

但是,在某些有限的情况下,MongoDB确实支持独立更新。更新不是全部或没有,但是MangGDB将保证没有人在写的中间向集合写入。

几个主要的注意事项:

  • 所有文档必须在同一个集合中
  • 必须在一个查询中指定所有更新
根据您提供的示例,您的案例可能符合条件

是描述独立更新的文档

基本上,当名称为“a”或“b”时,您将希望发出类似于以下内容的更新,以原子方式将“available”设置为false:


如果您确实需要它,可以在mongodb之上实现此逻辑(在您的应用程序中,或者更好地在mongo驱动程序的包装器中)

您正在请求隔离属性。实现这一点的一种方法是使用模式。这真是太过分了,但这是为了让你知道,如果你真的需要mongodb和一些酸性物质,你可以做些什么

描述了MVCC模式的一般实现。github上也有一个用于实现这一点的平台,但它是一个java项目


你也可以看到这一点和他们的答案。我现在的回答只是一个总结。

如果我想用不同的值自动更新不同的文档,该怎么办。如果名称=“a”,则更新计数=1;如果名称==“b”,则更新计数=2。这可能是不可能的。正如我所说,这项功能有一些重要的限制——MongoDB并不是专门为这类事情设计的。
{
    name: String,
    available: Boolean,
    for: String
}
{
    name: "a",
    available: true,
    for: ["b", "c"]
}
{
    name: "b",
    available: true,
    for: ["a", "b]
}
db.blah.update({"name": {"$in": ["a", "b"]}, "$atomic": 1}, {"available": false});