[{"data":1,"prerenderedAt":700},["ShallowReactive",2],{"\u002Fdocs\u002Fapi-reference\u002Fnosql-runner":3},{"id":4,"title":5,"body":6,"description":693,"extension":694,"meta":695,"navigation":80,"path":696,"seo":697,"stem":698,"__hash__":699},"docs\u002Fdocs\u002F4.api-reference\u002F5.nosql-runner.md","NoSQLRunner",{"type":7,"value":8,"toc":686},"minimark",[9,13,42,46,51,275,279,433,437,487,494,498,524,528,682],[10,11,5],"h1",{"id":12},"nosqlrunner",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-python shiki shiki-themes github-dark","from mango.nosql_runner import NoSQLRunner\n","python","",[21,22,23],"code",{"__ignoreMap":19},[24,25,28,32,36,39],"span",{"class":26,"line":27},"line",1,[24,29,31],{"class":30},"snl16","from",[24,33,35],{"class":34},"s95oV"," mango.nosql_runner ",[24,37,38],{"class":30},"import",[24,40,41],{"class":34}," NoSQLRunner\n",[43,44,45],"p",{},"Abstract base class for all database backends. Implement this to add support for any NoSQL database.",[47,48,50],"h2",{"id":49},"interface","Interface",[14,52,54],{"className":16,"code":53,"language":18,"meta":19,"style":19},"class NoSQLRunner(ABC):\n\n    @abstractmethod\n    def connect(self, connection_string: str, **kwargs) -> None: ...\n\n    @abstractmethod\n    def execute_query(self, operation: QueryRequest) -> pd.DataFrame: ...\n\n    @abstractmethod\n    def introspect_schema(self) -> dict[str, SchemaInfo]: ...\n\n    @abstractmethod\n    def get_sample_documents(self, collection: str, n: int = 5) -> list[dict]: ...\n\n    @abstractmethod\n    def list_collections(self) -> list[str]: ...\n\n    @abstractmethod\n    def get_indexes(self, collection: str) -> list[dict]: ...\n",[21,55,56,75,82,88,121,126,131,144,149,154,172,177,182,218,223,228,245,250,255],{"__ignoreMap":19},[24,57,58,61,65,68,72],{"class":26,"line":27},[24,59,60],{"class":30},"class",[24,62,64],{"class":63},"svObZ"," NoSQLRunner",[24,66,67],{"class":34},"(",[24,69,71],{"class":70},"sDLfK","ABC",[24,73,74],{"class":34},"):\n",[24,76,78],{"class":26,"line":77},2,[24,79,81],{"emptyLinePlaceholder":80},true,"\n",[24,83,85],{"class":26,"line":84},3,[24,86,87],{"class":63},"    @abstractmethod\n",[24,89,91,94,97,100,103,106,109,112,115,118],{"class":26,"line":90},4,[24,92,93],{"class":30},"    def",[24,95,96],{"class":63}," connect",[24,98,99],{"class":34},"(self, connection_string: ",[24,101,102],{"class":70},"str",[24,104,105],{"class":34},", ",[24,107,108],{"class":30},"**",[24,110,111],{"class":34},"kwargs) -> ",[24,113,114],{"class":70},"None",[24,116,117],{"class":34},": ",[24,119,120],{"class":70},"...\n",[24,122,124],{"class":26,"line":123},5,[24,125,81],{"emptyLinePlaceholder":80},[24,127,129],{"class":26,"line":128},6,[24,130,87],{"class":63},[24,132,134,136,139,142],{"class":26,"line":133},7,[24,135,93],{"class":30},[24,137,138],{"class":63}," execute_query",[24,140,141],{"class":34},"(self, operation: QueryRequest) -> pd.DataFrame: ",[24,143,120],{"class":70},[24,145,147],{"class":26,"line":146},8,[24,148,81],{"emptyLinePlaceholder":80},[24,150,152],{"class":26,"line":151},9,[24,153,87],{"class":63},[24,155,157,159,162,165,167,170],{"class":26,"line":156},10,[24,158,93],{"class":30},[24,160,161],{"class":63}," introspect_schema",[24,163,164],{"class":34},"(self) -> dict[",[24,166,102],{"class":70},[24,168,169],{"class":34},", SchemaInfo]: ",[24,171,120],{"class":70},[24,173,175],{"class":26,"line":174},11,[24,176,81],{"emptyLinePlaceholder":80},[24,178,180],{"class":26,"line":179},12,[24,181,87],{"class":63},[24,183,185,187,190,193,195,198,201,204,207,210,213,216],{"class":26,"line":184},13,[24,186,93],{"class":30},[24,188,189],{"class":63}," get_sample_documents",[24,191,192],{"class":34},"(self, collection: ",[24,194,102],{"class":70},[24,196,197],{"class":34},", n: ",[24,199,200],{"class":70},"int",[24,202,203],{"class":30}," =",[24,205,206],{"class":70}," 5",[24,208,209],{"class":34},") -> list[",[24,211,212],{"class":70},"dict",[24,214,215],{"class":34},"]: ",[24,217,120],{"class":70},[24,219,221],{"class":26,"line":220},14,[24,222,81],{"emptyLinePlaceholder":80},[24,224,226],{"class":26,"line":225},15,[24,227,87],{"class":63},[24,229,231,233,236,239,241,243],{"class":26,"line":230},16,[24,232,93],{"class":30},[24,234,235],{"class":63}," list_collections",[24,237,238],{"class":34},"(self) -> list[",[24,240,102],{"class":70},[24,242,215],{"class":34},[24,244,120],{"class":70},[24,246,248],{"class":26,"line":247},17,[24,249,81],{"emptyLinePlaceholder":80},[24,251,253],{"class":26,"line":252},18,[24,254,87],{"class":63},[24,256,258,260,263,265,267,269,271,273],{"class":26,"line":257},19,[24,259,93],{"class":30},[24,261,262],{"class":63}," get_indexes",[24,264,192],{"class":34},[24,266,102],{"class":70},[24,268,209],{"class":34},[24,270,212],{"class":70},[24,272,215],{"class":34},[24,274,120],{"class":70},[47,276,278],{"id":277},"queryrequest","QueryRequest",[14,280,282],{"className":16,"code":281,"language":18,"meta":19,"style":19},"@dataclass\nclass QueryRequest:\n    operation: Literal[\"find\", \"aggregate\", \"count\", \"distinct\"]\n    collection: str\n    filter: dict | None = None\n    pipeline: list[dict] | None = None\n    projection: dict | None = None\n    sort: dict | None = None\n    limit: int | None = None\n    distinct_field: str | None = None\n",[21,283,284,289,299,326,334,354,373,388,403,418],{"__ignoreMap":19},[24,285,286],{"class":26,"line":27},[24,287,288],{"class":63},"@dataclass\n",[24,290,291,293,296],{"class":26,"line":77},[24,292,60],{"class":30},[24,294,295],{"class":63}," QueryRequest",[24,297,298],{"class":34},":\n",[24,300,301,304,308,310,313,315,318,320,323],{"class":26,"line":84},[24,302,303],{"class":34},"    operation: Literal[",[24,305,307],{"class":306},"sU2Wk","\"find\"",[24,309,105],{"class":34},[24,311,312],{"class":306},"\"aggregate\"",[24,314,105],{"class":34},[24,316,317],{"class":306},"\"count\"",[24,319,105],{"class":34},[24,321,322],{"class":306},"\"distinct\"",[24,324,325],{"class":34},"]\n",[24,327,328,331],{"class":26,"line":90},[24,329,330],{"class":34},"    collection: ",[24,332,333],{"class":70},"str\n",[24,335,336,339,341,343,346,349,351],{"class":26,"line":123},[24,337,338],{"class":70},"    filter",[24,340,117],{"class":34},[24,342,212],{"class":70},[24,344,345],{"class":30}," |",[24,347,348],{"class":70}," None",[24,350,203],{"class":30},[24,352,353],{"class":70}," None\n",[24,355,356,359,361,364,367,369,371],{"class":26,"line":128},[24,357,358],{"class":34},"    pipeline: list[",[24,360,212],{"class":70},[24,362,363],{"class":34},"] ",[24,365,366],{"class":30},"|",[24,368,348],{"class":70},[24,370,203],{"class":30},[24,372,353],{"class":70},[24,374,375,378,380,382,384,386],{"class":26,"line":133},[24,376,377],{"class":34},"    projection: ",[24,379,212],{"class":70},[24,381,345],{"class":30},[24,383,348],{"class":70},[24,385,203],{"class":30},[24,387,353],{"class":70},[24,389,390,393,395,397,399,401],{"class":26,"line":146},[24,391,392],{"class":34},"    sort: ",[24,394,212],{"class":70},[24,396,345],{"class":30},[24,398,348],{"class":70},[24,400,203],{"class":30},[24,402,353],{"class":70},[24,404,405,408,410,412,414,416],{"class":26,"line":151},[24,406,407],{"class":34},"    limit: ",[24,409,200],{"class":70},[24,411,345],{"class":30},[24,413,348],{"class":70},[24,415,203],{"class":30},[24,417,353],{"class":70},[24,419,420,423,425,427,429,431],{"class":26,"line":156},[24,421,422],{"class":34},"    distinct_field: ",[24,424,102],{"class":70},[24,426,345],{"class":30},[24,428,348],{"class":70},[24,430,203],{"class":30},[24,432,353],{"class":70},[47,434,436],{"id":435},"exceptions","Exceptions",[438,439,440,453],"table",{},[441,442,443],"thead",{},[444,445,446,450],"tr",{},[447,448,449],"th",{},"Exception",[447,451,452],{},"When",[454,455,456,467,477],"tbody",{},[444,457,458,464],{},[459,460,461],"td",{},[21,462,463],{},"BackendError",[459,465,466],{},"Connection failure, collection not found, introspection error",[444,468,469,474],{},[459,470,471],{},[21,472,473],{},"QueryError",[459,475,476],{},"Driver error during query execution",[444,478,479,484],{},[459,480,481],{},[21,482,483],{},"ValidationError",[459,485,486],{},"Operation not allowed, missing required field",[43,488,489,490,493],{},"All inherit from ",[21,491,492],{},"MangoError",".",[47,495,497],{"id":496},"built-in-implementation","Built-in implementation",[438,499,500,510],{},[441,501,502],{},[444,503,504,507],{},[447,505,506],{},"Class",[447,508,509],{},"Import",[454,511,512],{},[444,513,514,519],{},[459,515,516],{},[21,517,518],{},"MongoRunner",[459,520,521],{},[21,522,523],{},"mango.integrations.mongodb",[47,525,527],{"id":526},"custom-implementation","Custom implementation",[14,529,531],{"className":16,"code":530,"language":18,"meta":19,"style":19},"from mango.nosql_runner import NoSQLRunner\nfrom mango.core.types import QueryRequest, SchemaInfo\nimport pandas as pd\n\nclass MyRedisRunner(NoSQLRunner):\n\n    def connect(self, connection_string: str, **kwargs) -> None:\n        self._client = redis.from_url(connection_string)\n\n    def execute_query(self, operation: QueryRequest) -> pd.DataFrame:\n        # Translate QueryRequest to Redis commands\n        ...\n\n    def list_collections(self) -> list[str]:\n        # In Redis: return key patterns or namespaces\n        ...\n\n    # implement remaining methods...\n",[21,532,533,543,555,568,572,585,589,609,623,627,636,642,647,651,664,669,673,677],{"__ignoreMap":19},[24,534,535,537,539,541],{"class":26,"line":27},[24,536,31],{"class":30},[24,538,35],{"class":34},[24,540,38],{"class":30},[24,542,41],{"class":34},[24,544,545,547,550,552],{"class":26,"line":77},[24,546,31],{"class":30},[24,548,549],{"class":34}," mango.core.types ",[24,551,38],{"class":30},[24,553,554],{"class":34}," QueryRequest, SchemaInfo\n",[24,556,557,559,562,565],{"class":26,"line":84},[24,558,38],{"class":30},[24,560,561],{"class":34}," pandas ",[24,563,564],{"class":30},"as",[24,566,567],{"class":34}," pd\n",[24,569,570],{"class":26,"line":90},[24,571,81],{"emptyLinePlaceholder":80},[24,573,574,576,579,581,583],{"class":26,"line":123},[24,575,60],{"class":30},[24,577,578],{"class":63}," MyRedisRunner",[24,580,67],{"class":34},[24,582,5],{"class":63},[24,584,74],{"class":34},[24,586,587],{"class":26,"line":128},[24,588,81],{"emptyLinePlaceholder":80},[24,590,591,593,595,597,599,601,603,605,607],{"class":26,"line":133},[24,592,93],{"class":30},[24,594,96],{"class":63},[24,596,99],{"class":34},[24,598,102],{"class":70},[24,600,105],{"class":34},[24,602,108],{"class":30},[24,604,111],{"class":34},[24,606,114],{"class":70},[24,608,298],{"class":34},[24,610,611,614,617,620],{"class":26,"line":146},[24,612,613],{"class":70},"        self",[24,615,616],{"class":34},"._client ",[24,618,619],{"class":30},"=",[24,621,622],{"class":34}," redis.from_url(connection_string)\n",[24,624,625],{"class":26,"line":151},[24,626,81],{"emptyLinePlaceholder":80},[24,628,629,631,633],{"class":26,"line":156},[24,630,93],{"class":30},[24,632,138],{"class":63},[24,634,635],{"class":34},"(self, operation: QueryRequest) -> pd.DataFrame:\n",[24,637,638],{"class":26,"line":174},[24,639,641],{"class":640},"sAwPA","        # Translate QueryRequest to Redis commands\n",[24,643,644],{"class":26,"line":179},[24,645,646],{"class":70},"        ...\n",[24,648,649],{"class":26,"line":184},[24,650,81],{"emptyLinePlaceholder":80},[24,652,653,655,657,659,661],{"class":26,"line":220},[24,654,93],{"class":30},[24,656,235],{"class":63},[24,658,238],{"class":34},[24,660,102],{"class":70},[24,662,663],{"class":34},"]:\n",[24,665,666],{"class":26,"line":225},[24,667,668],{"class":640},"        # In Redis: return key patterns or namespaces\n",[24,670,671],{"class":26,"line":230},[24,672,646],{"class":70},[24,674,675],{"class":26,"line":247},[24,676,81],{"emptyLinePlaceholder":80},[24,678,679],{"class":26,"line":252},[24,680,681],{"class":640},"    # implement remaining methods...\n",[683,684,685],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}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 .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":19,"searchDepth":77,"depth":77,"links":687},[688,689,690,691,692],{"id":49,"depth":77,"text":50},{"id":277,"depth":77,"text":278},{"id":435,"depth":77,"text":436},{"id":496,"depth":77,"text":497},{"id":526,"depth":77,"text":527},"Abstract interface for database backends.","md",{},"\u002Fdocs\u002Fapi-reference\u002Fnosql-runner",{"title":5,"description":693},"docs\u002F4.api-reference\u002F5.nosql-runner","vF0OZVNF4SYl2dGxQzeKqcLo4m7gUnEDYKBGHHgGlHU",1776189332159]