假设我在user_id
上创建了一个索引
db.members.createIndex( { "user_id": 1 }, { unique: true } )
我有三个问题:
"unique": true
是否会使批量插入速度变慢?答案 0 :(得分:0)
具有这种“独特”的含义:真的会使批量插入速度变慢吗?
这与“ upsert”有什么不同?
当您尝试批量插入包含某些重复项的插入时会发生什么?它会失败并回滚吗?还是仅仅因为少数人因唯一检查而失败了?
答案 1 :(得分:0)
1。拥有“独特”:true会使批处理插入速度变慢吗?
这是一个索引,因此按定义是。插入时,需要验证记录的唯一性。不确定是否需要花太多时间在这个问题上。
2。与“ upsert”有什么不同?
问题是,当您使用1 christmas holiday
1 Easter holiday
1 Friday day
2 Monday day
1 thanksgiving holiday
1 Thursday day
2 Tuesday day
选项进行更新时会发生什么。根据文档:
为避免多次插入同一文档,请仅使用upsert:true,如果查询字段为 唯一索引。
如果所有update()操作在任何客户端成功插入数据之前完成了查询部分,并且 名称字段上没有唯一索引,则每个更新操作都可能导致插入。 为了防止MongoDB多次插入同一文档,请在 名称字段。
使用唯一索引,如果多个应用程序使用upsert发出相同的更新:正确 一个update()将成功插入一个新文档。 其余操作将是:
•更新新插入的文档,或
•尝试插入重复项时失败。
如果操作由于重复的索引键错误而失败,则应用程序可以重试该操作, 将作为更新操作成功。 upsert:true,带有虚线_id查询
3。当您尝试批量插入包含某些重复项的插入时会发生什么?它会失败并回滚吗?还是只是因为唯一的检查而失败的少数失败?
这取决于。如果您将upsert: true
选项保留为默认值,则它将使用。但是,如果将其设置为 false :
如果 ordered 设置为 false ,文档将以无序格式插入,并且mongod可能会对其进行重新排序以提高性能。如果使用无序insertMany(),则应用程序不应依赖于插入的顺序。
,最重要的是,如果在批量ordered
期间发生错误:
将命令设置为 false ,插入操作将继续处理所有剩余文档。