查看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#驱动程序的匹配程度如何。)