Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:更新/升级与插入_Mongodb_Mongodb Query_Upsert - Fatal编程技术网

MongoDB:更新/升级与插入

MongoDB:更新/升级与插入,mongodb,mongodb-query,upsert,Mongodb,Mongodb Query,Upsert,最近,我注意到执行多个上传(via)和插入(多个文档)之间存在巨大的性能差异。我想知道我在这方面是否正确: Upsert/Updates类似于find()和update(),因此它执行两项读写操作 Insert将只进行写入,因此速度要快得多 那么性能的差异呢 如果是这种情况,我想知道我是否需要定期进行大量写入,而不是更新文档,而是使用createdOn字段编写新文档。然后要查询,我将只查询文档,按createdondesc排序。我想知道这是不是一个好方法?还是有更好的办法 我想知道我是否有

最近,我注意到执行多个上传(via)和插入(多个文档)之间存在巨大的性能差异。我想知道我在这方面是否正确:

  • Upsert/Updates类似于
    find()
    update()
    ,因此它执行两项读写操作
  • Insert将只进行写入,因此速度要快得多
那么性能的差异呢

如果是这种情况,我想知道我是否需要定期进行大量写入,而不是更新文档,而是使用
createdOn
字段编写新文档。然后要查询,我将只查询文档,按
createdondesc
排序。我想知道这是不是一个好方法?还是有更好的办法

  • 我想知道我是否有收藏索引,它会加速更新吗?但是这个索引会不会减慢写入部分的速度呢
  • 第二种方式,我只做插入,如果我有太多的文档,它会变慢吗?(加快书写速度)实用吗
  • 我还尝试增加连接池的大小。不确定什么是最佳的,但我尝试了20次,我发现我可以通过mongostat每秒处理abt 20个查询。我以为会高很多
我还没有找到关于
upsert
如何在MongoDB中工作的“官方”解释,但可以肯定的是,该操作旨在更新现有文档,并且仅在找不到具有给定条件的文档时才添加文档

如果添加索引,则
upsert
会变得更快:在所有索引都用于“查找”文档之后。注意事项在索引所操作的字段和要更新的字段中。如果更新的部分是索引的一部分,则会对更新文档的性能产生影响。如果更新的部分不是索引的一部分,则不会因写入现有文档而受到处罚。但是,如果添加文档,则会对性能产生较小的影响,因为索引集合是更新的。但是,仅仅添加一个文档仍然会更快

因此,如果在您的场景中您知道不想更新文档,那么插入通常会更快。如果要确保不添加同一文档两次,还可以选择添加唯一索引。然后,插入操作就会失败

总而言之,这取决于具体的场景,但根据我可以从您的问题中提取的信息,我认为最好的选择是简单地插入文档。由于您似乎确保“createdon”字段使文档在您的场景中是唯一的,因此您只需担心在读取场景中使用的索引

可在网站上找到一些额外信息:

有关设计(读取)索引的更多信息,可以找到关于索引是否向查询计划添加任何内容的非常好的解释:


我希望这有帮助。

如果插入文档,Mongodb需要检查是否存在具有相同objectId的文档。如果其存在,则无法插入文档

同样的情况也适用于更新。它需要检查文档是否存在。否则无法执行更新。如果未根据ObjectId/索引字段查找文档,则更新查询将变慢

否则,插入/更新文档的性能应相同

例如

所以Insert可以是这样的//(Fast)

  • (检查文档->未找到->插入新文档)其他
  • (检查文档->找到->无法插入)
  • 并使用upsert更新(ObjectId可用)/(Fast)

  • (检查文档->未找到->插入新文档)其他
  • (检查文档->找到->更新文档)
  • 或者使用upsert更新(没有ObjectId)//这很慢

  • (查找ObjectId(慢速)->未找到->插入新文档)其他
  • (查找ObjectId(慢速)->查找->更新文档)

  • 通常,索引仅用于加快读取速度。不写入。=>每次创建不同的文档:这将是一个很好的解决方案,具体取决于您添加文档的频率。如果文档数量在很短的时间内会很大,那么您的查找查询就会变慢。我不会使用此bcos,我在每个查询中都有订单文档。。。即使是我也必须得到一个文档。如果你有一个索引不是类型的Id怎么办ObjectId@eranotzap操作会像ObjectId字段一样快速。这就像什么都没说,你的意思是什么?@eranotzap ObjectId的插入、更新和删除等操作都很快,因为默认情况下它是索引的。因此,任何被索引的字段都可以像对象一样快速地插入、更新和删除。你不理解这个问题。我的意思是,如果我不使用ObjectId(类型)作为我的ID,那么用Date替换它并索引它。那也一样快。