对于以下命令, wherequery只能匹配一个文档(请注意,bulkWrite()默认情况下是有序的):
final BulkWriteResult res = db.getCollection("mycol").bulkWrite(Arrays.asList(
new UpdateOneModel<>(query,
new Document("$addToSet", new Document("some_things", things))),
new UpdateOneModel<>(query,
new Document("$pull", new Document("some_things", otherthings)))));
Run Code Online (Sandbox Code Playgroud)
...我知道如果第一次更新成功而第二次失败(在正常情况下应该是不可能的),第一次更新仍将应用于文档,这意味着批量写入不是严格原子的。但是,假设两个查询都成功,操作是原子的吗?例如,其他写入是否可以在两个操作之间交错?
当我在 MongoDB 3 中发出有序批量操作时,批量操作是否会作为一个整体写入 oplog,以便在服务器崩溃后可以作为一个整体重播?
这个问题的理由如下:
我知道没有真正的事务,但我可以使用$isolated关键字来获得一定的读取一致性(在某些情况下)。除了架构设计是否良好之外,我们假设我必须一次性更新可能不同集合中的多个文档,这将是 SQL 中的事务。我不关心数据在任何时刻都处于不一致状态,但我确实要求数据最终保持一致。因此,虽然我可能不关心操作期间的错误和丢失回滚,但我要求在某个时刻完全执行或根本不执行更新序列,以便让它们在意外的服务器故障或中间关闭中幸存下来。批量操作(例如,由于随机 CoreOS 更新)。