面试题答案
一键面试在MongoDB中,处理插入文档时主键重复的情况有以下几种方式:
- 默认行为(报错)
- 实现方法:默认情况下,当向具有唯一索引(通常主键会自动创建唯一索引)的集合插入重复键的文档时,MongoDB会抛出一个错误,阻止插入操作。
- 示例:假设集合
users
有一个_id
字段作为主键(默认唯一),如果尝试插入重复_id
的文档:
db.users.insertOne({_id: 1, name: 'John'})
// 首次插入成功
db.users.insertOne({_id: 1, name: 'Jane'})
// 第二次插入会报错,提示E11000 duplicate key error collection
- 使用
upsert
选项- 实现方法:
upsert
选项用于更新操作。当设置upsert
为true
时,如果文档不存在则插入,如果存在(基于查询条件,通常是主键条件)则更新。 - 命令参数:在
updateOne
或updateMany
方法中使用。例如,要确保插入或更新具有特定_id
的文档:
- 实现方法:
db.users.updateOne(
{_id: 1},
{$set: {name: 'UpdatedName'}},
{upsert: true}
)
这里,如果_id
为1的文档不存在,updateOne
会插入一个新文档,文档内容为{_id: 1, name: 'UpdatedName'}
;如果存在,则更新name
字段为UpdatedName
。
3. 使用bulkWrite
并处理错误
- 实现方法:可以使用
bulkWrite
方法批量插入文档,并通过捕获错误来处理重复键的情况。在bulkWrite
操作数组中,每个操作对象可以是insertOne
等操作。 - 命令参数:
try {
db.users.bulkWrite([
{insertOne: {document: {_id: 1, name: 'User1'}}},
{insertOne: {document: {_id: 2, name: 'User2'}}},
{insertOne: {document: {_id: 1, name: 'User3'}}} // 重复键
]);
} catch (e) {
if (e.code === 11000) {
// 处理重复键错误
print("Duplicate key error, handle it as needed");
} else {
throw e;
}
}
这里,bulkWrite
尝试批量插入文档,遇到重复键错误(错误码11000)时,在catch
块中进行处理。可以根据实际需求决定如何处理,比如跳过该重复插入操作等。