首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更新与替换的Mongodb含义

更新与替换的Mongodb含义
EN

Stack Overflow用户
提问于 2017-09-06 03:06:12
回答 2查看 8.9K关注 0票数 27

我读过this related question,但下面的是不同的。mongodb驱动程序在document集合类上有一个ReplaceOne方法(&一个异步对应方法),该方法可用于替换符合c#参数的文档的全部内容。另一种方法是使用UpdateOneUpdateMany方法(或异步方法),这需要构建UpdateDefinition<TDocument>

我的问题与选择其中一种方法而不是另一种方法(replace vs update)的含义有关,在您有足够的输入数据的情况下,可以选择其中一种方法来实现相同的结果。换句话说,如果我拥有整个原始文档,并且只希望更新其中的一小部分内容。

我能想到的第一个因素是发送到数据库服务器的有效负载。虽然我没有阅读任何mongodb c#驱动程序源代码,也找不到任何文档来验证这一点,但似乎ReplaceOne必须在更新操作中发送更多字节,特别是对于较大的文档。Update...方法似乎可以通过只发送需要修改的文档片段的更新元数据(以及两种方法都必须发送的过滤条件)来避免较小的负载。有人能证实这是否是一个准确的假设吗?

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-09-14 10:48:01

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

1)没错,但最小的问题是,两者的搜索条件是相同的,但是replaceOne将要求在查询中传递整个文档,当您拥有完整的新文档并希望确保它将以这种方式结束时,这仍然是有价值的

2) reindex on replace ->是的,replaceOne替换整个文档而不是更新现有的文档,如果您更新索引上的元素,索引将需要重新调整以适应更改,但使用replace它将始终需要重新调整。_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/

票数 3
EN

Stack Overflow用户

发布于 2017-09-14 21:15:29

如果合并到REST服务中,replaceOne方法将与PUT操作很好地结合在一起,在PUT操作中,您将在请求正文中发送整个对象以及对象标识符,然后可以将其整个持久化到数据库中。PUT操作的显著特征是它是幂等的(您可以重复运行它)。replaceOne采用默认为false的upsert选项,但如果将其设置为true (并且搜索条件位于唯一索引的字段上),则无论文档是否被独立删除,该操作都是可重复的。

更新操作更类似于POST操作,因为它只更新文档的一部分,而不是完全替换文档。它还需要一个upsert选项,但如果文档被另一个进程删除,则结果文档可能格式错误,更新可能会失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46061753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档