Practical Examples
Real-World Reference Scenarios
E-Commerce Product Management
class ProductReferenceManager:
def __init__(self, db):
self.products = db['products']
self.categories = db['categories']
self.inventory = db['inventory']
def create_product_with_references(self, product_data):
## Create category reference
category = self.categories.find_one_or_insert({
"name": product_data['category']
})
## Create product with category reference
product = {
"name": product_data['name'],
"price": product_data['price'],
"category_ref": category['_id'],
"inventory_ref": None
}
## Insert product and create inventory
product_id = self.products.insert_one(product).inserted_id
inventory_doc = {
"product_ref": product_id,
"quantity": product_data['quantity']
}
inventory_id = self.inventory.insert_one(inventory_doc).inserted_id
## Update product with inventory reference
self.products.update_one(
{"_id": product_id},
{"$set": {"inventory_ref": inventory_id}}
)
Reference Lookup Patterns
Aggregation-Based Reference Resolution
def resolve_product_details(product_id):
pipeline = [
{"$match": {"_id": product_id}},
{"$lookup": {
"from": "categories",
"localField": "category_ref",
"foreignField": "_id",
"as": "category"
}},
{"$lookup": {
"from": "inventory",
"localField": "inventory_ref",
"foreignField": "_id",
"as": "stock"
}}
]
return list(products_collection.aggregate(pipeline))
Reference Design Patterns
Relationship Visualization
graph TD
A[Product] -->|Category Ref| B[Category]
A -->|Inventory Ref| C[Inventory]
B -->|Parent Category| D[Parent Category]
Reference Type |
Query Complexity |
Read Performance |
Write Performance |
Embedded |
Low |
High |
Medium |
Child References |
Medium |
Medium |
High |
Parent References |
High |
Low |
Low |
Advanced Reference Handling
class ReferenceOptimizer:
def __init__(self, db):
self.db = db
def batch_reference_update(self, references):
bulk_operations = []
for ref in references:
bulk_operations.append(
UpdateOne(
{"_id": ref['document_id']},
{"$set": {"reference_field": ref['new_reference']}}
)
)
return self.db.bulk_write(bulk_operations)
Practical LabEx Implementation
def create_complex_reference_structure():
## Simulating a multi-collection reference scenario
university = {
"name": "LabEx Tech University",
"departments": []
}
departments = [
{
"name": "Computer Science",
"courses": [
{"name": "Advanced MongoDB", "credits": 3},
{"name": "Distributed Systems", "credits": 4}
]
}
]
## Insert and link references
university_id = universities.insert_one(university).inserted_id
for dept in departments:
dept['university_ref'] = university_id
department_id = departments.insert_one(dept).inserted_id
Reference Management Best Practices
- Use indexing on reference fields
- Implement lazy loading for complex references
- Cache frequently accessed reference data
- Monitor and optimize aggregation pipelines
- Consider denormalization for read-heavy workloads
Error Handling in References
def safe_reference_resolution(collection, reference_id):
try:
document = collection.find_one({"_id": reference_id})
if not document:
raise ReferenceError("Referenced document not found")
return document
except Exception as e:
logging.error(f"Reference resolution failed: {e}")
return None
Conclusion
Effective reference management in MongoDB requires:
- Understanding data relationships
- Choosing appropriate reference strategies
- Balancing performance and flexibility
- Implementing robust error handling