Skip to content

4.3 更新文档 (Update)

概述

更新文档是MongoDB中修改现有数据的核心操作。MongoDB提供了丰富的更新操作符和灵活的更新策略,支持单文档更新、批量更新、条件更新等多种更新方式。本章节将详细介绍MongoDB文档更新的各种方法、更新操作符和性能优化技巧。

MongoDB的更新操作具有原子性、灵活性和高性能的特点。掌握更新操作对于维护数据一致性和实现业务逻辑至关重要。

基本概念

更新方法

MongoDB提供以下更新方法:

  1. updateOne():更新单个文档
  2. updateMany():更新多个文档
  3. replaceOne():替换单个文档
  4. findOneAndUpdate():查找并更新单个文档
  5. bulkWrite():批量执行更新操作

更新操作符

MongoDB支持以下更新操作符:

  • 字段操作符$set$unset$rename$inc$mul
  • 数组操作符$push$pull$addToSet$pop
  • 数组修改器$$[]$[identifier]
  • 位操作符$bit$bitsAllClear
  • 日期操作符$currentDate$min$max

更新选项

更新支持以下选项:

  • upsert:不存在时插入新文档
  • multi:更新多个文档(已弃用,使用updateMany)
  • arrayFilters:数组更新过滤条件
  • hint:使用指定索引
  • collation:指定排序规则

原理深度解析

单文档更新原理

使用updateOne()方法更新单个文档:

php
<?php
// 单文档更新详解
class SingleDocumentUpdate {
    private $database;
    
    public function __construct($databaseName) {
        $client = new MongoDB\Client("mongodb://localhost:27017");
        $this->database = $client->selectDatabase($databaseName);
    }
    
    public function updateDocument($collectionName, $filter, $update) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount(),
                'upserted_id' => $result->getUpsertedId(),
                'acknowledged' => $result->isAcknowledged()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithSet($collectionName, $filter, $fields) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$set' => $fields];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$set',
                'fields_updated' => array_keys($fields),
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithInc($collectionName, $filter, $increments) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$inc' => $increments];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$inc',
                'fields_incremented' => array_keys($increments),
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithUnset($collectionName, $filter, $fields) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$unset' => array_fill_keys($fields, 1)];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$unset',
                'fields_removed' => $fields,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithUpsert($collectionName, $filter, $update) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $result = $collection->updateOne($filter, $update, ['upsert' => true]);
            
            $wasInserted = $result->getUpsertedCount() > 0;
            $wasUpdated = $result->getModifiedCount() > 0;
            
            return [
                'success' => true,
                'upsert_enabled' => true,
                'inserted' => $wasInserted,
                'updated' => $wasUpdated,
                'upserted_id' => $result->getUpsertedId(),
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
}

// 使用示例
$singleUpdate = new SingleDocumentUpdate('testdb');

// 基本更新
$filter = ['email' => 'john@example.com'];
$update = ['$set' => ['name' => 'John Updated']];
$result = $singleUpdate->updateDocument('users', $filter, $update);
print_r($result);

// 使用$set更新多个字段
$fields = [
    'name' => 'John Smith',
    'age' => 31,
    'updated_at' => new MongoDB\BSON\UTCDateTime()
];
$setResult = $singleUpdate->updateWithSet('users', ['email' => 'john@example.com'], $fields);
print_r($setResult);

// 使用$inc增加数值
$increments = [
    'login_count' => 1,
    'score' => 10
];
$incResult = $singleUpdate->updateWithInc('users', ['email' => 'john@example.com'], $increments);
print_r($incResult);

// 使用$unset删除字段
$unsetResult = $singleUpdate->updateWithUnset('users', ['email' => 'john@example.com'], ['temp_field', 'old_data']);
print_r($unsetResult);

// 使用upsert
$upsertResult = $singleUpdate->updateWithUpsert(
    'users',
    ['email' => 'newuser@example.com'],
    ['$set' => ['name' => 'New User', 'created_at' => new MongoDB\BSON\UTCDateTime()]]
);
print_r($upsertResult);
?>

批量更新原理

使用updateMany()方法更新多个文档:

php
<?php
// 批量更新详解
class BatchDocumentUpdate {
    private $database;
    
    public function __construct($databaseName) {
        $client = new MongoDB\Client("mongodb://localhost:27017");
        $this->database = $client->selectDatabase($databaseName);
    }
    
    public function updateManyDocuments($collectionName, $filter, $update, $options = []) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $result = $collection->updateMany($filter, $update, $options);
            
            return [
                'success' => true,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount(),
                'upserted_count' => $result->getUpsertedCount(),
                'upserted_id' => $result->getUpsertedId(),
                'acknowledged' => $result->isAcknowledged()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Batch update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithProgress($collectionName, $filter, $update, $callback = null) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            // 获取匹配的文档总数
            $totalMatched = $collection->countDocuments($filter);
            
            // 执行更新
            $result = $collection->updateMany($filter, $update);
            
            $updateResult = [
                'success' => true,
                'total_matched' => $totalMatched,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
            // 调用回调函数
            if ($callback && is_callable($callback)) {
                $callback($updateResult);
            }
            
            return $updateResult;
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateInBatches($collectionName, $filter, $update, $batchSize = 1000) {
        $collection = $this->database->selectCollection($collectionName);
        
        $results = [
            'total_batches' => 0,
            'total_matched' => 0,
            'total_modified' => 0,
            'batch_results' => []
        ];
        
        try {
            // 获取所有匹配的文档ID
            $documentIds = [];
            $cursor = $collection->find($filter, ['projection' => ['_id' => 1]]);
            
            foreach ($cursor as $document) {
                $documentIds[] = $document['_id'];
            }
            
            // 分批更新
            $batches = array_chunk($documentIds, $batchSize);
            
            foreach ($batches as $batchIndex => $batch) {
                $batchFilter = ['_id' => ['$in' => $batch]];
                
                $result = $collection->updateMany($batchFilter, $update);
                
                $batchResult = [
                    'batch_number' => $batchIndex + 1,
                    'batch_size' => count($batch),
                    'matched_count' => $result->getMatchedCount(),
                    'modified_count' => $result->getModifiedCount()
                ];
                
                $results['total_batches']++;
                $results['total_matched'] += $result->getMatchedCount();
                $results['total_modified'] += $result->getModifiedCount();
                $results['batch_results'][] = $batchResult;
            }
            
            return $results;
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Batch update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function updateWithArrayFilters($collectionName, $filter, $update, $arrayFilters) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $options = ['arrayFilters' => $arrayFilters];
            $result = $collection->updateMany($filter, $update, $options);
            
            return [
                'success' => true,
                'array_filters' => $arrayFilters,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Update with array filters failed',
                'message' => $e->getMessage()
            ];
        }
    }
}

// 使用示例
$batchUpdate = new BatchDocumentUpdate('testdb');

// 批量更新
$filter = ['status' => 'pending'];
$update = ['$set' => ['status' => 'processed', 'processed_at' => new MongoDB\BSON\UTCDateTime()]];
$result = $batchUpdate->updateManyDocuments('orders', $filter, $update);
print_r($result);

// 带进度的批量更新
$progressCallback = function($result) {
    echo "Update completed: ";
    echo "Matched {$result['matched_count']}, ";
    echo "Modified {$result['modified_count']}\n";
};

$progressResult = $batchUpdate->updateWithProgress(
    'users',
    ['active' => false],
    ['$set' => ['archived' => true, 'archived_at' => new MongoDB\BSON\UTCDateTime()]],
    $progressCallback
);
print_r($progressResult);

// 分批更新
$batchResult = $batchUpdate->updateInBatches(
    'products',
    ['category' => 'electronics'],
    ['$set' => ['discount' => 0.1]],
    500
);
print_r($batchResult);

// 使用数组过滤器更新
$arrayFilterResult = $batchUpdate->updateWithArrayFilters(
    'orders',
    ['order_id' => 'ORD001'],
    ['$set' => ['items.$[elem].price' => 99.99]],
    [['elem.item_id' => 'ITEM001']]
);
print_r($arrayFilterResult);
?>

数组更新操作符

使用数组操作符更新数组字段:

php
<?php
// 数组更新操作符详解
class ArrayUpdateOperators {
    private $database;
    
    public function __construct($databaseName) {
        $client = new MongoDB\Client("mongodb://localhost:27017");
        $this->database = $client->selectDatabase($databaseName);
    }
    
    public function pushToArray($collectionName, $filter, $field, $value) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$push' => [$field => $value]];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$push',
                'field' => $field,
                'value_pushed' => $value,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Push operation failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function pushMultipleToArray($collectionName, $filter, $field, $values) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$push' => [$field => ['$each' => $values]]];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$push with $each',
                'field' => $field,
                'values_pushed' => count($values),
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Push multiple operation failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function pullFromArray($collectionName, $filter, $field, $value) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$pull' => [$field => $value]];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$pull',
                'field' => $field,
                'value_pulled' => $value,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Pull operation failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function addToSet($collectionName, $filter, $field, $value) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$addToSet' => [$field => $value]];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$addToSet',
                'field' => $field,
                'value_added' => $value,
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'AddToSet operation failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function popFromArray($collectionName, $filter, $field, $position = 1) {
        $collection = $this->database->selectCollection($collectionName);
        
        try {
            $update = ['$pop' => [$field => $position]];
            $result = $collection->updateOne($filter, $update);
            
            return [
                'success' => true,
                'operator' => '$pop',
                'field' => $field,
                'position' => $position === 1 ? 'last' : 'first',
                'matched_count' => $result->getMatchedCount(),
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Pop operation failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function demonstrateArrayOperators($collectionName, $documentId) {
        $collection = $this->database->selectCollection($collectionName);
        
        $demonstrations = [];
        
        // $push演示
        $pushResult = $this->pushToArray(
            $collectionName,
            ['_id' => new MongoDB\BSON\ObjectId($documentId)],
            'tags',
            'new_tag'
        );
        $demonstrations['push'] = $pushResult;
        
        // $addToSet演示
        $addToSetResult = $this->addToSet(
            $collectionName,
            ['_id' => new MongoDB\BSON\ObjectId($documentId)],
            'tags',
            'unique_tag'
        );
        $demonstrations['addToSet'] = $addToSetResult;
        
        // $pull演示
        $pullResult = $this->pullFromArray(
            $collectionName,
            ['_id' => new MongoDB\BSON\ObjectId($documentId)],
            'tags',
            'old_tag'
        );
        $demonstrations['pull'] = $pullResult;
        
        // $pop演示
        $popResult = $this->popFromArray(
            $collectionName,
            ['_id' => new MongoDB\BSON\ObjectId($documentId)],
            'tags',
            1
        );
        $demonstrations['pop'] = $popResult;
        
        return $demonstrations;
    }
}

// 使用示例
$arrayOperators = new ArrayUpdateOperators('testdb');

// $push操作
$pushResult = $arrayOperators->pushToArray(
    'users',
    ['email' => 'john@example.com'],
    'tags',
    'developer'
);
print_r($pushResult);

// $push with $each操作
$pushManyResult = $arrayOperators->pushMultipleToArray(
    'users',
    ['email' => 'john@example.com'],
    'tags',
    ['php', 'mongodb', 'web']
);
print_r($pushManyResult);

// $pull操作
$pullResult = $arrayOperators->pullFromArray(
    'users',
    ['email' => 'john@example.com'],
    'tags',
    'old_tag'
);
print_r($pullResult);

// $addToSet操作
$addToSetResult = $arrayOperators->addToSet(
    'users',
    ['email' => 'john@example.com'],
    'tags',
    'unique_tag'
);
print_r($addToSetResult);

// $pop操作
$popResult = $arrayOperators->popFromArray(
    'users',
    ['email' => 'john@example.com'],
    'tags',
    1
);
print_r($popResult);
?>

常见错误与踩坑点

错误1:更新操作符使用错误

问题描述:错误使用更新操作符导致更新失败。

php
<?php
// 错误示例 - 更新操作符使用错误
try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    $database = $client->selectDatabase("testdb");
    $collection = $database->selectCollection('users');
    
    // 错误:在$set中使用更新操作符
    $collection->updateOne(
        ['email' => 'john@example.com'],
        ['$set' => ['age' => ['$inc' => 1]]]
    );
    
} catch (Exception $e) {
    echo "错误: " . $e->getMessage() . "\n";
}

// 正确示例 - 正确使用更新操作符
$client = new MongoDB\Client("mongodb://localhost:27017");
$database = $client->selectDatabase("testdb");
$collection = $database->selectCollection('users');

// 正确:直接使用$inc操作符
$collection->updateOne(
    ['email' => 'john@example.com'],
    ['$inc' => ['age' => 1]]
);

echo "Age incremented successfully\n";

// 正确:在$set中设置具体值
$collection->updateOne(
    ['email' => 'john@example.com'],
    ['$set' => ['name' => 'John Updated']]
);

echo "Name updated successfully\n";
?>

错误2:数组更新位置错误

问题描述:使用位置操作符时位置不正确。

php
<?php
// 错误示例 - 数组更新位置错误
try {
    $client = new MongoDB\Client("mongodb://localhost:27017");
    $database = $client->selectDatabase("testdb");
    $collection = $database->selectCollection('users');
    
    // 错误:使用$操作符更新不存在的数组元素
    $collection->updateOne(
        ['email' => 'john@example.com'],
        ['$set' => ['tags.10' => 'new_tag']]
    );
    
} catch (Exception $e) {
    echo "错误: " . $e->getMessage() . "\n";
}

// 正确示例 - 正确的数组更新
$client = new MongoDB\Client("mongodb://localhost:27017");
$database = $client->selectDatabase("testdb");
$collection = $database->selectCollection('users');

// 正确:使用$push添加元素
$collection->updateOne(
    ['email' => 'john@example.com'],
    ['$push' => ['tags' => 'new_tag']]
);

echo "Tag added successfully\n";

// 正确:使用数组过滤器更新特定元素
$collection->updateOne(
    ['email' => 'john@example.com'],
    ['$set' => ['tags.$[elem]' => 'updated_tag']],
    ['arrayFilters' => [['elem' => 'old_tag']]]
);

echo "Tag updated successfully\n";
?>

常见应用场景

场景1:用户信息更新

实现用户信息更新功能:

php
<?php
// 用户信息更新系统
class UserProfileUpdate {
    private $database;
    
    public function __construct($databaseName) {
        $client = new MongoDB\Client("mongodb://localhost:27017");
        $this->database = $client->selectDatabase($databaseName);
    }
    
    public function updateProfile($userId, $profileData) {
        $collection = $this->database->selectCollection('users');
        
        try {
            $update = ['$set' => []];
            
            // 构建更新语句
            foreach ($profileData as $field => $value) {
                if ($field === 'tags') {
                    // 使用$addToSet处理标签
                    $update['$addToSet'] = ['tags' => ['$each' => $value]];
                } else {
                    // 使用$set处理其他字段
                    $update['$set'][$field] = $value;
                }
            }
            
            $update['$set']['updated_at'] = new MongoDB\BSON\UTCDateTime();
            
            $result = $collection->updateOne(
                ['_id' => new MongoDB\BSON\ObjectId($userId)],
                $update
            );
            
            return [
                'success' => true,
                'modified_count' => $result->getModifiedCount(),
                'fields_updated' => array_keys($profileData)
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Profile update failed',
                'message' => $e->getMessage()
            ];
        }
    }
    
    public function incrementLoginCount($userId) {
        $collection = $this->database->selectCollection('users');
        
        try {
            $result = $collection->updateOne(
                ['_id' => new MongoDB\BSON\ObjectId($userId)],
                [
                    '$inc' => ['login_count' => 1],
                    '$set' => [
                        'last_login' => new MongoDB\BSON\UTCDateTime(),
                        'updated_at' => new MongoDB\BSON\UTCDateTime()
                    ]
                ]
            );
            
            return [
                'success' => true,
                'login_count_incremented' => $result->getModifiedCount() > 0
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Login count update failed',
                'message' => $e->getMessage()
            ];
        }
    }
}

// 使用示例
$profileUpdate = new UserProfileUpdate('user_db');

// 更新用户资料
$profileData = [
    'name' => 'John Updated',
    'age' => 31,
    'tags' => ['developer', 'mongodb', 'php']
];

$updateResult = $profileUpdate->updateProfile('507f1f77bcf86cd799439011', $profileData);
print_r($updateResult);

// 增加登录次数
$loginResult = $profileUpdate->incrementLoginCount('507f1f77bcf86cd799439011');
print_r($loginResult);
?>

常见问题答疑

问题1:如何选择合适的更新操作符?

回答:根据更新需求选择操作符:

php
<?php
// 更新操作符选择助手
class UpdateOperatorSelector {
    public static function selectOperator($updateType, $field, $value) {
        $operators = [
            'set_value' => ['$set' => [$field => $value]],
            'increment' => ['$inc' => [$field => $value]],
            'multiply' => ['$mul' => [$field => $value]],
            'rename' => ['$rename' => [$field => $value]],
            'unset' => ['$unset' => [$field => 1]],
            'push' => ['$push' => [$field => $value]],
            'pull' => ['$pull' => [$field => $value]],
            'addToSet' => ['$addToSet' => [$field => $value]]
        ];
        
        return $operators[$updateType] ?? null;
    }
}

// 使用示例
$operator = UpdateOperatorSelector::selectOperator('set_value', 'name', 'John');
print_r($operator);
?>

实战练习

练习1:实现订单状态更新

实现订单状态更新系统:

php
<?php
// 订单状态更新系统
class OrderStatusUpdate {
    private $database;
    
    public function __construct($databaseName) {
        $client = new MongoDB\Client("mongodb://localhost:27017");
        $this->database = $client->selectDatabase($databaseName);
    }
    
    public function updateOrderStatus($orderId, $newStatus, $metadata = []) {
        $collection = $this->database->selectCollection('orders');
        
        try {
            $update = [
                '$set' => [
                    'status' => $newStatus,
                    'updated_at' => new MongoDB\BSON\UTCDateTime()
                ]
            ];
            
            // 添加状态历史
            $update['$push'] = [
                'status_history' => [
                    'status' => $newStatus,
                    'timestamp' => new MongoDB\BSON\UTCDateTime(),
                    'metadata' => $metadata
                ]
            ];
            
            $result = $collection->updateOne(
                ['order_id' => $orderId],
                $update
            );
            
            return [
                'success' => true,
                'order_id' => $orderId,
                'new_status' => $newStatus,
                'modified_count' => $result->getModifiedCount()
            ];
            
        } catch (Exception $e) {
            return [
                'success' => false,
                'error' => 'Order status update failed',
                'message' => $e->getMessage()
            ];
        }
    }
}

// 使用示例
$orderUpdate = new OrderStatusUpdate('order_db');

// 更新订单状态
$result = $orderUpdate->updateOrderStatus(
    'ORD001',
    'shipped',
    ['shipped_by' => 'user_001', 'tracking_number' => 'TRK123456']
);
print_r($result);
?>

知识点总结

核心概念

  1. 更新方法updateOne()updateMany()replaceOne()
  2. 更新操作符:字段操作符、数组操作符、位操作符
  3. 更新选项:upsert、arrayFilters、hint
  4. 更新性能:索引优化、批量更新、条件更新

更新操作符

  1. 字段操作符$set$unset$inc$mul$rename
  2. 数组操作符$push$pull$addToSet$pop
  3. 数组修改器$$[]$[identifier]
  4. 日期操作符$currentDate$min$max

最佳实践

  1. 原子更新:使用更新操作符保证原子性
  2. 批量更新:使用updateMany()提高性能
  3. 条件更新:精确的过滤条件避免误更新
  4. 性能优化:为更新字段创建索引

常见场景

  1. 用户信息更新:使用$set更新用户资料
  2. 计数器更新:使用$inc增加计数
  3. 数组操作:使用数组操作符管理数组字段
  4. 状态更新:使用$set更新状态字段

拓展参考资料

官方文档

推荐阅读

  • 《MongoDB更新操作详解》
  • 《MongoDB原子操作实践》
  • 《MongoDB性能优化指南》

在线资源

  • MongoDB University更新操作课程
  • MongoDB官方博客更新操作文章
  • Stack Overflow MongoDB更新相关问题