Mongodb对更新与替换的影响

dan*_*wig 19 c# replace updates mongodb

我已经阅读了这个相关的问题,但下面的一个是不同的.mongodb c#驱动程序ReplaceOne在文档集合类上有一个方法(和一个异步对应项),可用于替换适合filter参数的文档的整个内容.另一种方法是使用UpdateOne或者UpdateMany方法(或异步对应物),这需要构建一个UpdateDefinition<TDocument>.

我的问题与选择其中一种方法相对于另一种方法(替换vs更新)的影响有关,如果您有足够的输入数据来选择实现相同的结果.换句话说,如果我有整个原始文档,并且只希望更新其内容的一小部分.

我能想到的第一个因素是发送到数据库服务器的有效负载.虽然我没有读过任何mongodb c#驱动程序源并且找不到任何文件来验证这一点,但似乎ReplaceOne可能需要通过更新操作发送更多字节,特别是对于较大的文档.该Update...方法看起来他们可以通过只在发送更新的元数据文件需要修改的(除了筛选标准,这两种方法都必须发送)切片逃脱较小的有效载荷.任何人都可以验证这是否是一个准确的假设?

同事提出的另一个因素是方法的选择(更新与替换)也可能影响文档索引.这里的假设是,使用ReplaceOne有可能导致数据库重建正在更新的文档的所有索引,而这些Update...方法具有足够的更改元数据信息,以避免在不属于更新定义中的元数据的字段上重建索引.任何人都可以验证mongodb是否在内部处理文档索引构建方式不同,具体取决于是否使用replace和update修改了文档?

对于我们来说,第三个因素已经出现了几次,关于课程AddToSetPullFilter方法Update<TDefinition>.看起来这些Update...方法不允许你通过向它添加项目和同时从中删除项目来修改文档中的集合(如json数组); 这些操作必须单独发送,使用2个单独的Update...方法调用以及单独的Update<TDefinition>实例(尽管使用相同的过滤器参数).ReplaceOne在这种情况下,该方法似乎是在单个"事务"中进行此类文档更改的唯一方法,至少在使用C#驱动程序时.目前,我们正在使用Update...超过ReplaceOne现在,因为我们不确定是否如上面提到的替代方案将产生负面影响的索引.

除了这些之外,还有什么其他影响可能导致人们选择ReplaceOne家庭方法而不是Update...家庭,反之亦然?同样,这假设你有足够的输入数据(即所有文档数据)来实现两种方法相同的结果,不介意直接改变状态(通过替换),并且不介意构建mongo定义(通过更新) .

小智 3

由于 mongo 数据是非结构化的,replaceOne 与 Update 的主要优点是保证您将删除所有字段并替换为新文档,从而使查询更简单

1)确实如此,但至少你的问题是,两者的搜索条件是相同的,但replaceOne将要求在查询中传递整个文档,当你拥有完整的新文档并希望确保它会时,仍然值得就这样结束

2) 替换时重新索引 -> 是的,replaceOne 替换整个文档而不是更新现有文档,如果更新索引上的元素,则索引将需要重新调整以适应更改,但使用替换时,它将始终需要重新调整。_id 索引不受这两个操作的影响(我认为)

3)如果你已经有了你想要的值,你不需要替换整个文档来更改单个字段,使其被所有字段重新索引,你应该使用 $set 操作,你可以将 ReplaceOne 视为单个字段而不是整个文档

https://docs.mongodb.com/manual/reference/method/db.collection.replaceOne/index.html https://docs.mongodb.com/manual/reference/operator/update/set/