137 lines
4.2 KiB
Python
137 lines
4.2 KiB
Python
"""
|
|
MongoDB Index Creation Script
|
|
|
|
Creates all necessary indexes for optimized queries.
|
|
Run this script after migration to ensure indexes are in place.
|
|
|
|
Usage:
|
|
python backend/scripts/create_indexes.py
|
|
"""
|
|
|
|
from pymongo import MongoClient
|
|
from config import get_settings
|
|
from typing import Dict, List, Tuple
|
|
|
|
|
|
def create_indexes():
|
|
"""Create all required MongoDB indexes."""
|
|
|
|
settings = get_settings()
|
|
client = MongoClient(settings.mongodb_uri)
|
|
db = client[settings.mongodb_db_name]
|
|
|
|
print(f"✓ Connected to MongoDB: {settings.mongodb_db_name}\n")
|
|
|
|
indexes_created = []
|
|
|
|
# ========== USERS COLLECTION INDEXES ==========
|
|
print("Creating indexes for 'users' collection...")
|
|
|
|
# Unique index on email
|
|
try:
|
|
db.users.create_index(
|
|
[("email", 1)],
|
|
unique=True,
|
|
name="email_unique"
|
|
)
|
|
indexes_created.append(("users", "email_unique"))
|
|
print(" ✓ Created unique index on email")
|
|
except Exception as e:
|
|
print(f" ⚠ Email index: {e}")
|
|
|
|
# Index on createdAt for sorting
|
|
try:
|
|
db.users.create_index(
|
|
[("createdAt", -1)],
|
|
name="createdAt_desc"
|
|
)
|
|
indexes_created.append(("users", "createdAt_desc"))
|
|
print(" ✓ Created index on createdAt")
|
|
except Exception as e:
|
|
print(f" ⚠ createdAt index: {e}")
|
|
|
|
# ========== ENTRIES COLLECTION INDEXES ==========
|
|
print("\nCreating indexes for 'entries' collection...")
|
|
|
|
# Compound index: userId + createdAt (for history pagination)
|
|
try:
|
|
db.entries.create_index(
|
|
[("userId", 1), ("createdAt", -1)],
|
|
name="userId_createdAt"
|
|
)
|
|
indexes_created.append(("entries", "userId_createdAt"))
|
|
print(" ✓ Created compound index on (userId, createdAt)")
|
|
except Exception as e:
|
|
print(f" ⚠ userId_createdAt index: {e}")
|
|
|
|
# Compound index: userId + entryDate (for calendar queries)
|
|
try:
|
|
db.entries.create_index(
|
|
[("userId", 1), ("entryDate", 1)],
|
|
name="userId_entryDate"
|
|
)
|
|
indexes_created.append(("entries", "userId_entryDate"))
|
|
print(" ✓ Created compound index on (userId, entryDate)")
|
|
except Exception as e:
|
|
print(f" ⚠ userId_entryDate index: {e}")
|
|
|
|
# Index on tags for searching (optional, for future)
|
|
try:
|
|
db.entries.create_index(
|
|
[("tags", 1)],
|
|
name="tags"
|
|
)
|
|
indexes_created.append(("entries", "tags"))
|
|
print(" ✓ Created index on tags")
|
|
except Exception as e:
|
|
print(f" ⚠ tags index: {e}")
|
|
|
|
# Index on entryDate range queries (for calendar)
|
|
try:
|
|
db.entries.create_index(
|
|
[("entryDate", -1)],
|
|
name="entryDate_desc"
|
|
)
|
|
indexes_created.append(("entries", "entryDate_desc"))
|
|
print(" ✓ Created index on entryDate")
|
|
except Exception as e:
|
|
print(f" ⚠ entryDate index: {e}")
|
|
|
|
# TTL Index on entries (optional: for auto-deleting old entries if needed)
|
|
# Uncomment if you want entries to auto-delete after 2 years
|
|
# try:
|
|
# db.entries.create_index(
|
|
# [("createdAt", 1)],
|
|
# expireAfterSeconds=63072000, # 2 years
|
|
# name="createdAt_ttl"
|
|
# )
|
|
# print(" ✓ Created TTL index on createdAt (2 years)")
|
|
# except Exception as e:
|
|
# print(f" ⚠ TTL index: {e}")
|
|
|
|
# ========== SUMMARY ==========
|
|
print(f"\n{'='*60}")
|
|
print(f"✓ Index Creation Complete")
|
|
print(f"{'='*60}")
|
|
print(f"Total indexes created: {len(indexes_created)}")
|
|
for collection, index_name in indexes_created:
|
|
print(f" • {collection}.{index_name}")
|
|
|
|
# Optional: Print summary of all indexes
|
|
print(f"\n{'='*60}")
|
|
print("All Indexes Summary")
|
|
print(f"{'='*60}")
|
|
|
|
for collection_name in ["users", "entries"]:
|
|
print(f"\n{collection_name}:")
|
|
collection = db[collection_name]
|
|
for index_info in collection.list_indexes():
|
|
print(f" • {index_info['name']}")
|
|
|
|
client.close()
|
|
print("\n✓ Disconnected from MongoDB")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
create_indexes()
|