面试题答案
一键面试- 抛出异常策略
- 说明:默认情况下,当插入文档违反唯一索引约束时,MongoDB会抛出一个写错误异常。这种方式简单直接,适合在对数据准确性要求极高,不允许重复数据存在的场景。
- 代码实现(以Python的pymongo库为例):
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["test_database"]
collection = db["test_collection"]
document = {"unique_field": "unique_value", "other_field": "data"}
try:
collection.insert_one(document)
except pymongo.errors.DuplicateKeyError as e:
print(f"插入重复键错误: {e}")
- 更新现有文档策略
- 说明:如果遇到重复键,可以选择更新已存在的文档,而不是插入新文档。这在需要不断更新已有记录的场景(如用户信息更新等)比较适用。
- 代码实现(以Python的pymongo库为例):
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["test_database"]
collection = db["test_collection"]
document = {"unique_field": "unique_value", "other_field": "new_data"}
result = collection.update_one(
{"unique_field": "unique_value"},
{"$set": document},
upsert=True
)
print(f"匹配的文档数: {result.matched_count},修改的文档数: {result.modified_count}")
这里upsert=True
表示如果没有匹配的文档就插入新文档,有匹配的就更新文档。
3. 忽略重复键策略
- 说明:可以选择忽略重复键错误,继续执行后续操作。这种策略在数据量较大,且部分重复数据对业务影响不大的场景下适用。
- 代码实现(以Python的pymongo库为例):
import pymongo
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["test_database"]
collection = db["test_collection"]
document = {"unique_field": "unique_value", "other_field": "data"}
try:
collection.insert_one(document, bypass_document_validation=True)
except pymongo.errors.DuplicateKeyError:
pass
这里bypass_document_validation=True
可以绕过一些写操作的验证,但是要谨慎使用,因为这可能会导致数据不符合预期的模式。同时,在except
块中直接pass
,忽略了重复键错误。