查看mongodb文档,我读到FindOneAndReplace将是ATOMIC操作。但是我不明白的是,为什么ReplaceOne不会是原子的?如果有区别,为什么一个人根本不要使用ReplaceOne?

最佳答案

该文档公开了一个不同的方法签名:

ReplaceOne:

ReplaceOneResult ReplaceOne(
    FilterDefinition<TDocument> filter,
    TDocument replacement,
    ReplaceOptions options = null,
    CancellationToken cancellationToken = null
)

FindOneAndReplace:

TProjection FindOneAndReplace<TProjection>(
    FilterDefinition<TDocument> filter,
    TDocument replacement,
    FindOneAndReplaceOptions<TDocument, TProjection> options = null,
    CancellationToken cancellationToken = null
)

最值得注意的是,返回类型和options参数有所不同。
ReplaceOne返回ReplaceOneResult时,FindOneAndReplace返回文档(请注意选项中的ReturnDocument属性)。

ReplaceOptions 相比, FindOneAndReplaceOptions 相当有限,例如前者没有提供sort属性,以使您可以控制哪个文档将成为集合中第一个匹配的文档。如果您根据ID进行过滤,则没有关系,但是如果您要替换最新的文档,则sort选项非常有用。

(旁注:我个人在https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndReplace/处发现文档很有帮助,因为它们更详细地解释了用法并提供了一些示例。但是我不知道它与MongoDB C#驱动程序的匹配程度如何。)

09-11 17:59