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