[{"data":1,"prerenderedAt":621},["ShallowReactive",2],{"\u002Fdocs\u002Fcore-concepts\u002Fschema":3},{"id":4,"title":5,"body":6,"description":614,"extension":615,"meta":616,"navigation":193,"path":617,"seo":618,"stem":619,"__hash__":620},"docs\u002Fdocs\u002F2.core-concepts\u002F4.schema.md","Schema Introspection",{"type":7,"value":8,"toc":606},"minimark",[9,13,17,22,38,94,98,164,168,171,232,236,242,309,315,443,447,454,458,602],[10,11,5],"h1",{"id":12},"schema-introspection",[14,15,16],"p",{},"Mango samples your collections to infer field types, indexes, and cross-collection references. The result is injected into the system prompt so the LLM generates correct queries without guessing.",[18,19,21],"h2",{"id":20},"how-it-works","How it works",[14,23,24,25,29,30,33,34,37],{},"When you call ",[26,27,28],"code",{},"agent.setup()"," with ",[26,31,32],{},"introspect=True",", Mango runs ",[26,35,36],{},"introspect_schema()"," on your database:",[39,40,41,53,59,68,88],"ol",{},[42,43,44,48,49,52],"li",{},[45,46,47],"strong",{},"Sample documents"," — fetches up to 100 documents per collection (mix of sequential + random via ",[26,50,51],{},"$sample",")",[42,54,55,58],{},[45,56,57],{},"Infer fields"," — walks every document, records field paths, types, and presence frequency",[42,60,61,64,65],{},[45,62,63],{},"Detect indexes"," — reads index definitions via ",[26,66,67],{},"index_information()",[42,69,70,73,74,77,78,81,82,77,85],{},[45,71,72],{},"Detect references"," — heuristic: ",[26,75,76],{},"user_id"," → looks for ",[26,79,80],{},"users"," collection, ",[26,83,84],{},"movieId",[26,86,87],{},"movies",[42,89,90,93],{},[45,91,92],{},"Build prompt"," — schema is serialized and injected into the system prompt",[18,95,97],{"id":96},"enable-introspection","Enable introspection",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-python shiki shiki-themes github-dark","agent = MangoAgent(\n    ...,\n    introspect=True,   # run introspect_schema() on setup()\n)\nagent.setup()\n","python","",[26,106,107,123,133,152,158],{"__ignoreMap":104},[108,109,112,116,120],"span",{"class":110,"line":111},"line",1,[108,113,115],{"class":114},"s95oV","agent ",[108,117,119],{"class":118},"snl16","=",[108,121,122],{"class":114}," MangoAgent(\n",[108,124,126,130],{"class":110,"line":125},2,[108,127,129],{"class":128},"sDLfK","    ...",[108,131,132],{"class":114},",\n",[108,134,136,140,142,145,148],{"class":110,"line":135},3,[108,137,139],{"class":138},"s9osk","    introspect",[108,141,119],{"class":118},[108,143,144],{"class":128},"True",[108,146,147],{"class":114},",   ",[108,149,151],{"class":150},"sAwPA","# run introspect_schema() on setup()\n",[108,153,155],{"class":110,"line":154},4,[108,156,157],{"class":114},")\n",[108,159,161],{"class":110,"line":160},5,[108,162,163],{"class":114},"agent.setup()\n",[18,165,167],{"id":166},"pass-pre-computed-schema","Pass pre-computed schema",[14,169,170],{},"For production deployments you may want to introspect once and reuse:",[99,172,174],{"className":101,"code":173,"language":103,"meta":104,"style":104},"schema = db.introspect_schema()   # run once, save\u002Fcache the result\n\nagent = MangoAgent(\n    ...,\n    schema=schema,     # pass directly, introspect=False (default)\n)\nagent.setup()\n",[26,175,176,189,195,203,209,222,227],{"__ignoreMap":104},[108,177,178,181,183,186],{"class":110,"line":111},[108,179,180],{"class":114},"schema ",[108,182,119],{"class":118},[108,184,185],{"class":114}," db.introspect_schema()   ",[108,187,188],{"class":150},"# run once, save\u002Fcache the result\n",[108,190,191],{"class":110,"line":125},[108,192,194],{"emptyLinePlaceholder":193},true,"\n",[108,196,197,199,201],{"class":110,"line":135},[108,198,115],{"class":114},[108,200,119],{"class":118},[108,202,122],{"class":114},[108,204,205,207],{"class":110,"line":154},[108,206,129],{"class":128},[108,208,132],{"class":114},[108,210,211,214,216,219],{"class":110,"line":160},[108,212,213],{"class":138},"    schema",[108,215,119],{"class":118},[108,217,218],{"class":114},"schema,     ",[108,220,221],{"class":150},"# pass directly, introspect=False (default)\n",[108,223,225],{"class":110,"line":224},6,[108,226,157],{"class":114},[108,228,230],{"class":110,"line":229},7,[108,231,163],{"class":114},[18,233,235],{"id":234},"schemainfo","SchemaInfo",[14,237,238,239,241],{},"Each collection produces a ",[26,240,235],{},":",[99,243,245],{"className":101,"code":244,"language":103,"meta":104,"style":104},"@dataclass\nclass SchemaInfo:\n    collection_name: str\n    document_count: int\n    fields: list[FieldInfo]\n    indexes: list[dict]\n    sample_documents: list[dict]   # 5 representative docs\n",[26,246,247,253,264,272,280,285,296],{"__ignoreMap":104},[108,248,249],{"class":110,"line":111},[108,250,252],{"class":251},"svObZ","@dataclass\n",[108,254,255,258,261],{"class":110,"line":125},[108,256,257],{"class":118},"class",[108,259,260],{"class":251}," SchemaInfo",[108,262,263],{"class":114},":\n",[108,265,266,269],{"class":110,"line":135},[108,267,268],{"class":114},"    collection_name: ",[108,270,271],{"class":128},"str\n",[108,273,274,277],{"class":110,"line":154},[108,275,276],{"class":114},"    document_count: ",[108,278,279],{"class":128},"int\n",[108,281,282],{"class":110,"line":160},[108,283,284],{"class":114},"    fields: list[FieldInfo]\n",[108,286,287,290,293],{"class":110,"line":224},[108,288,289],{"class":114},"    indexes: list[",[108,291,292],{"class":128},"dict",[108,294,295],{"class":114},"]\n",[108,297,298,301,303,306],{"class":110,"line":229},[108,299,300],{"class":114},"    sample_documents: list[",[108,302,292],{"class":128},[108,304,305],{"class":114},"]   ",[108,307,308],{"class":150},"# 5 representative docs\n",[14,310,311,312,241],{},"Each field produces a ",[26,313,314],{},"FieldInfo",[99,316,318],{"className":101,"code":317,"language":103,"meta":104,"style":104},"@dataclass\nclass FieldInfo:\n    name: str\n    path: str              # dotted path e.g. \"address.city\"\n    types: list[str]       # e.g. [\"string\", \"null\"]\n    frequency: float       # 0.0–1.0, how often field appears\n    is_indexed: bool\n    is_unique: bool\n    is_reference: bool\n    reference_collection: str | None\n    sub_fields: list[FieldInfo] | None    # for subdocuments\n    array_element_types: list[str] | None\n",[26,319,320,324,333,340,351,364,375,383,391,399,413,428],{"__ignoreMap":104},[108,321,322],{"class":110,"line":111},[108,323,252],{"class":251},[108,325,326,328,331],{"class":110,"line":125},[108,327,257],{"class":118},[108,329,330],{"class":251}," FieldInfo",[108,332,263],{"class":114},[108,334,335,338],{"class":110,"line":135},[108,336,337],{"class":114},"    name: ",[108,339,271],{"class":128},[108,341,342,345,348],{"class":110,"line":154},[108,343,344],{"class":114},"    path: ",[108,346,347],{"class":128},"str",[108,349,350],{"class":150},"              # dotted path e.g. \"address.city\"\n",[108,352,353,356,358,361],{"class":110,"line":160},[108,354,355],{"class":114},"    types: list[",[108,357,347],{"class":128},[108,359,360],{"class":114},"]       ",[108,362,363],{"class":150},"# e.g. [\"string\", \"null\"]\n",[108,365,366,369,372],{"class":110,"line":224},[108,367,368],{"class":114},"    frequency: ",[108,370,371],{"class":128},"float",[108,373,374],{"class":150},"       # 0.0–1.0, how often field appears\n",[108,376,377,380],{"class":110,"line":229},[108,378,379],{"class":114},"    is_indexed: ",[108,381,382],{"class":128},"bool\n",[108,384,386,389],{"class":110,"line":385},8,[108,387,388],{"class":114},"    is_unique: ",[108,390,382],{"class":128},[108,392,394,397],{"class":110,"line":393},9,[108,395,396],{"class":114},"    is_reference: ",[108,398,382],{"class":128},[108,400,402,405,407,410],{"class":110,"line":401},10,[108,403,404],{"class":114},"    reference_collection: ",[108,406,347],{"class":128},[108,408,409],{"class":118}," |",[108,411,412],{"class":128}," None\n",[108,414,416,419,422,425],{"class":110,"line":415},11,[108,417,418],{"class":114},"    sub_fields: list[FieldInfo] ",[108,420,421],{"class":118},"|",[108,423,424],{"class":128}," None",[108,426,427],{"class":150},"    # for subdocuments\n",[108,429,431,434,436,439,441],{"class":110,"line":430},12,[108,432,433],{"class":114},"    array_element_types: list[",[108,435,347],{"class":128},[108,437,438],{"class":114},"] ",[108,440,421],{"class":118},[108,442,412],{"class":128},[18,444,446],{"id":445},"large-databases","Large databases",[14,448,449,450,453],{},"For databases with 100+ collections, Mango groups them by name pattern in the system prompt to avoid token explosion. The full schema is only fetched when the LLM calls ",[26,451,452],{},"describe_collection"," for a specific collection.",[18,455,457],{"id":456},"manual-schema-inspection","Manual schema inspection",[99,459,461],{"className":101,"code":460,"language":103,"meta":104,"style":104},"schema = db.introspect_schema()\n\nfor collection_name, info in schema.items():\n    print(f\"{collection_name}: {info.document_count} docs, {len(info.fields)} fields\")\n    for field in info.fields:\n        print(f\"  {field.path} ({', '.join(field.types)}) freq={field.frequency:.0%}\")\n",[26,462,463,472,476,490,540,553],{"__ignoreMap":104},[108,464,465,467,469],{"class":110,"line":111},[108,466,180],{"class":114},[108,468,119],{"class":118},[108,470,471],{"class":114}," db.introspect_schema()\n",[108,473,474],{"class":110,"line":125},[108,475,194],{"emptyLinePlaceholder":193},[108,477,478,481,484,487],{"class":110,"line":135},[108,479,480],{"class":118},"for",[108,482,483],{"class":114}," collection_name, info ",[108,485,486],{"class":118},"in",[108,488,489],{"class":114}," schema.items():\n",[108,491,492,495,498,501,505,508,511,514,517,519,522,524,527,530,533,535,538],{"class":110,"line":154},[108,493,494],{"class":128},"    print",[108,496,497],{"class":114},"(",[108,499,500],{"class":118},"f",[108,502,504],{"class":503},"sU2Wk","\"",[108,506,507],{"class":128},"{",[108,509,510],{"class":114},"collection_name",[108,512,513],{"class":128},"}",[108,515,516],{"class":503},": ",[108,518,507],{"class":128},[108,520,521],{"class":114},"info.document_count",[108,523,513],{"class":128},[108,525,526],{"class":503}," docs, ",[108,528,529],{"class":128},"{len",[108,531,532],{"class":114},"(info.fields)",[108,534,513],{"class":128},[108,536,537],{"class":503}," fields\"",[108,539,157],{"class":114},[108,541,542,545,548,550],{"class":110,"line":160},[108,543,544],{"class":118},"    for",[108,546,547],{"class":114}," field ",[108,549,486],{"class":118},[108,551,552],{"class":114}," info.fields:\n",[108,554,555,558,560,562,565,567,570,572,575,577,580,583,585,588,590,593,596,598,600],{"class":110,"line":224},[108,556,557],{"class":128},"        print",[108,559,497],{"class":114},[108,561,500],{"class":118},[108,563,564],{"class":503},"\"  ",[108,566,507],{"class":128},[108,568,569],{"class":114},"field.path",[108,571,513],{"class":128},[108,573,574],{"class":503}," (",[108,576,507],{"class":128},[108,578,579],{"class":503},"', '",[108,581,582],{"class":114},".join(field.types)",[108,584,513],{"class":128},[108,586,587],{"class":503},") freq=",[108,589,507],{"class":128},[108,591,592],{"class":114},"field.frequency",[108,594,595],{"class":118},":.0%",[108,597,513],{"class":128},[108,599,504],{"class":503},[108,601,157],{"class":114},[603,604,605],"style",{},"html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":104,"searchDepth":125,"depth":125,"links":607},[608,609,610,611,612,613],{"id":20,"depth":125,"text":21},{"id":96,"depth":125,"text":97},{"id":166,"depth":125,"text":167},{"id":234,"depth":125,"text":235},{"id":445,"depth":125,"text":446},{"id":456,"depth":125,"text":457},"How Mango infers your database schema automatically.","md",{},"\u002Fdocs\u002Fcore-concepts\u002Fschema",{"title":5,"description":614},"docs\u002F2.core-concepts\u002F4.schema","ZYIw3BJX6JDN0z61rViL73kGl1KQbvfAPrW2xNeb_z4",1776189331966]