2026-01-06 22:59:58 +08:00

76 lines
4.9 KiB
Markdown

# Requirements Document
## Introduction
This feature addresses a MongoDB compatibility issue where the current implementation uses the `$unionWith` aggregation operator, which is only available in MongoDB 4.4+. The system needs to support MongoDB 3.x environments by replacing the `$unionWith` approach with a compatible solution that queries collections separately and performs deduplication in application code.
## Glossary
- **Inspection_Result_System**: The secondary circuit inspection result management system
- **MongoDB_Driver**: The C# MongoDB driver used to interact with MongoDB
- **Collection_Sharding**: The practice of splitting data across multiple collections based on time periods (year-month)
- **Deduplication**: The process of removing duplicate inspection results based on day, inspection item ID, and status
- **Aggregation_Pipeline**: MongoDB's framework for data aggregation operations
## Requirements
### Requirement 1: Replace $unionWith with Compatible Approach
**User Story:** As a system administrator, I want the inspection result query to work on MongoDB 3.x, so that I don't need to upgrade the database server.
#### Acceptance Criteria
1. WHEN the system queries inspection results across multiple collections, THE Inspection_Result_System SHALL NOT use the $unionWith operator
2. WHEN querying multiple collections, THE Inspection_Result_System SHALL query each collection separately using standard MongoDB operations
3. WHEN multiple collection queries complete, THE Inspection_Result_System SHALL merge the results in application memory
4. THE Inspection_Result_System SHALL maintain the same deduplication logic (by Year, Month, Day, SecondaryCircuitInspectionItemId, and Status)
5. THE Inspection_Result_System SHALL maintain the same sorting and pagination behavior as the current implementation
### Requirement 2: Preserve Query Performance
**User Story:** As a system user, I want query performance to remain acceptable, so that the application remains responsive.
#### Acceptance Criteria
1. WHEN querying inspection results, THE Inspection_Result_System SHALL complete queries within 5 seconds for typical datasets (up to 12 months of data)
2. WHEN performance degrades, THE Inspection_Result_System SHALL log performance warnings with timing details
3. THE Inspection_Result_System SHALL use projection to limit fields retrieved from MongoDB
4. THE Inspection_Result_System SHALL apply filters at the MongoDB level before retrieving data
5. WHEN sorting results, THE Inspection_Result_System SHALL perform sorting in-memory after deduplication
### Requirement 3: Maintain Functional Equivalence
**User Story:** As a developer, I want the new implementation to produce identical results to the old implementation, so that existing functionality is not broken.
#### Acceptance Criteria
1. WHEN deduplicating results, THE Inspection_Result_System SHALL group by the same fields (Year, Month, Day, SecondaryCircuitInspectionItemId, Status)
2. WHEN multiple records exist for the same group, THE Inspection_Result_System SHALL select the first record after sorting
3. WHEN paginating results, THE Inspection_Result_System SHALL return the correct page of results based on skip and limit parameters
4. THE Inspection_Result_System SHALL return both the paginated results and the total count
5. WHEN handling null Status values, THE Inspection_Result_System SHALL treat them consistently with the original implementation
### Requirement 4: Error Handling and Logging
**User Story:** As a system administrator, I want clear error messages and logging, so that I can troubleshoot issues effectively.
#### Acceptance Criteria
1. WHEN a collection query fails, THE Inspection_Result_System SHALL log the error with collection name and continue with other collections
2. WHEN all collection queries fail, THE Inspection_Result_System SHALL return an appropriate error message
3. THE Inspection_Result_System SHALL log the number of collections queried and the number of results from each collection
4. THE Inspection_Result_System SHALL log performance metrics including query time and deduplication time
5. WHEN query time exceeds thresholds, THE Inspection_Result_System SHALL log performance warnings
### Requirement 5: Backward Compatibility
**User Story:** As a developer, I want the method signature to remain unchanged, so that calling code does not need to be modified.
#### Acceptance Criteria
1. THE Inspection_Result_System SHALL maintain the same method signature for QueryPagedDeduplicatedResultsAcrossCollectionsAsync
2. THE Inspection_Result_System SHALL accept the same parameters (collectionNames, filter, sortField, isDescending, skipCount, pageSize, cancellationToken)
3. THE Inspection_Result_System SHALL return the same result type (tuple of List<SecondaryCircuitInspectionResult> and long totalCount)
4. THE Inspection_Result_System SHALL support cancellation via CancellationToken
5. THE Inspection_Result_System SHALL handle empty collection lists by returning empty results