Files
grateful-journal/backend/scripts/create_indexes.py
2026-03-09 10:54:07 +05:30

137 lines
4.1 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()