[{"data":1,"prerenderedAt":2968},["ShallowReactive",2],{"navigation_docs":3,"-essentials-collections":106,"-essentials-collections-surround":2963},[4,26,57,83],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":25},"Getting Started","i-lucide-rocket","/getting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-play",false,{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":25},"Core Concepts","i-lucide-book-open","/essentials","2.essentials",[32,37,42,47,52],{"title":33,"path":34,"stem":35,"icon":36},"Models","/essentials/models","2.essentials/1.models","i-lucide-box",{"title":38,"path":39,"stem":40,"icon":41},"Collections","/essentials/collections","2.essentials/2.collections","i-lucide-folder",{"title":43,"path":44,"stem":45,"icon":46},"Views","/essentials/views","2.essentials/3.views","i-lucide-table",{"title":48,"path":49,"stem":50,"icon":51},"Schema Evolution","/essentials/schema-evolution","2.essentials/4.schema-evolution","i-lucide-git-branch",{"title":53,"path":54,"stem":55,"icon":56},"Relations","/essentials/relations","2.essentials/5.relations","i-lucide-link",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":25},"Advanced","i-lucide-settings","/advanced","3.advanced",[63,68,73,78],{"title":64,"path":65,"stem":66,"icon":67},"Time-Series","/advanced/time-series","3.advanced/1.time-series","i-lucide-chart-line",{"title":69,"path":70,"stem":71,"icon":72},"Async Support","/advanced/async","3.advanced/2.async","i-lucide-zap",{"title":74,"path":75,"stem":76,"icon":77},"PostgreSQL","/advanced/postgresql","3.advanced/3.postgresql","i-lucide-database",{"title":79,"path":80,"stem":81,"icon":82},"Performance Guide","/advanced/performance","3.advanced/4.performance","i-lucide-gauge",{"title":84,"icon":85,"path":86,"stem":87,"children":88,"page":25},"API Reference","i-lucide-file-code","/api","4.api",[89,94,98,101],{"title":90,"path":91,"stem":92,"icon":93},"Engine","/api/engine","4.api/1.engine","i-lucide-cog",{"title":95,"path":96,"stem":97,"icon":41},"Collection","/api/collection","4.api/2.collection",{"title":33,"path":99,"stem":100,"icon":36},"/api/models","4.api/3.models",{"title":102,"path":103,"stem":104,"icon":105},"Exceptions","/api/exceptions","4.api/4.exceptions","i-lucide-alert-triangle",{"id":107,"title":38,"body":108,"description":2956,"extension":2957,"links":2958,"meta":2959,"navigation":2960,"path":39,"seo":2961,"stem":40,"__hash__":2962},"docs/2.essentials/2.collections.md",{"type":109,"value":110,"toc":2928},"minimark",[111,115,118,146,151,252,266,270,297,453,458,472,491,498,523,527,530,754,773,777,780,925,929,940,1008,1012,1016,1019,1085,1092,1149,1153,1156,1199,1206,1259,1263,1270,1420,1427,1434,1545,1552,1555,1619,1623,1630,1792,1803,1806,1966,1988,1992,1995,2083,2096,2205,2216,2247,2251,2260,2327,2339,2343,2346,2371,2377,2464,2492,2496,2499,2536,2540,2546,2778,2788,2791,2810,2902,2912,2924],[112,113,114],"p",{},"A collection is a named container backed by a database table. You'll interact with collections for every read and write operation in CentauroDB. This guide walks you through the complete workflow — from storing your first object to building filtered queries.",[112,116,117],{},"CentauroDB provides two collection types:",[119,120,121,135],"ul",{},[122,123,124,130,131,134],"li",{},[125,126,127],"strong",{},[128,129,95],"code",{}," — for regular models (",[128,132,133],{},"CentauroModel",")",[122,136,137,142,143,134],{},[125,138,139],{},[128,140,141],{},"TimeSeriesCollection"," — for models with time-series data (",[128,144,145],{},"CentauroModelSeries",[147,148,150],"h2",{"id":149},"setting-up-a-collection","Setting up a collection",[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from centaurodb import Engine, Collection, CentauroModel\n\nengine = Engine(\"inventory.db\")\ncoll = Collection(engine, \"inventory\")\n","python","",[128,159,160,191,198,225],{"__ignoreMap":157},[161,162,165,169,173,176,179,183,186,188],"span",{"class":163,"line":164},"line",1,[161,166,168],{"class":167},"s7zQu","from",[161,170,172],{"class":171},"sTEyZ"," centaurodb ",[161,174,175],{"class":167},"import",[161,177,178],{"class":171}," Engine",[161,180,182],{"class":181},"sMK4o",",",[161,184,185],{"class":171}," Collection",[161,187,182],{"class":181},[161,189,190],{"class":171}," CentauroModel\n",[161,192,194],{"class":163,"line":193},2,[161,195,197],{"emptyLinePlaceholder":196},true,"\n",[161,199,201,204,207,210,213,216,220,222],{"class":163,"line":200},3,[161,202,203],{"class":171},"engine ",[161,205,206],{"class":181},"=",[161,208,178],{"class":209},"s2Zo4",[161,211,212],{"class":181},"(",[161,214,215],{"class":181},"\"",[161,217,219],{"class":218},"sfazB","inventory.db",[161,221,215],{"class":181},[161,223,224],{"class":181},")\n",[161,226,228,231,233,235,237,240,242,245,248,250],{"class":163,"line":227},4,[161,229,230],{"class":171},"coll ",[161,232,206],{"class":181},[161,234,185],{"class":209},[161,236,212],{"class":181},[161,238,239],{"class":209},"engine",[161,241,182],{"class":181},[161,243,244],{"class":181}," \"",[161,246,247],{"class":218},"inventory",[161,249,215],{"class":181},[161,251,224],{"class":181},[112,253,254,255,258,259,262,263,265],{},"The collection name must match ",[128,256,257],{},"[a-z][a-z0-9_]*"," — lowercase letters, digits, and underscores, starting with a letter. The backing table (",[128,260,261],{},"inventory_objects",") is created automatically on first use. Creating a ",[128,264,95],{}," with the same name twice is safe and idempotent.",[147,267,269],{"id":268},"choosing-a-collection-name","Choosing a collection name",[112,271,272,273,276,277,280,281,284,285,288,289,292,293,296],{},"The collection name becomes a ",[125,274,275],{},"table prefix"," in the database — ",[128,278,279],{},"{name}_objects",", ",[128,282,283],{},"{name}_values"," (for time-series), and ",[128,286,287],{},"{name}_view_*",". Because a single collection can hold many model types (distinguished by ",[128,290,291],{},"__centauro_name__","), the name should describe the ",[125,294,295],{},"domain or project",", not a single model type.",[152,298,300],{"className":154,"code":299,"language":156,"meta":157,"style":157},"# Good — domain-level names\nCollection(engine, \"inventory\")     # inventory_objects\nCollection(engine, \"research\")      # research_objects\nCollection(engine, \"trading\")       # trading_objects\n\n# Bad — too narrow, too vague, or redundant\nCollection(engine, \"notes\")         # what happens when you add Tags, Users?\nCollection(engine, \"data\")          # meaningless\nCollection(engine, \"my_objects\")    # table becomes my_objects_objects\n",[128,301,302,308,329,351,373,378,384,407,430],{"__ignoreMap":157},[161,303,304],{"class":163,"line":164},[161,305,307],{"class":306},"sHwdD","# Good — domain-level names\n",[161,309,310,312,314,316,318,320,322,324,326],{"class":163,"line":193},[161,311,95],{"class":209},[161,313,212],{"class":181},[161,315,239],{"class":209},[161,317,182],{"class":181},[161,319,244],{"class":181},[161,321,247],{"class":218},[161,323,215],{"class":181},[161,325,134],{"class":181},[161,327,328],{"class":306},"     # inventory_objects\n",[161,330,331,333,335,337,339,341,344,346,348],{"class":163,"line":200},[161,332,95],{"class":209},[161,334,212],{"class":181},[161,336,239],{"class":209},[161,338,182],{"class":181},[161,340,244],{"class":181},[161,342,343],{"class":218},"research",[161,345,215],{"class":181},[161,347,134],{"class":181},[161,349,350],{"class":306},"      # research_objects\n",[161,352,353,355,357,359,361,363,366,368,370],{"class":163,"line":227},[161,354,95],{"class":209},[161,356,212],{"class":181},[161,358,239],{"class":209},[161,360,182],{"class":181},[161,362,244],{"class":181},[161,364,365],{"class":218},"trading",[161,367,215],{"class":181},[161,369,134],{"class":181},[161,371,372],{"class":306},"       # trading_objects\n",[161,374,376],{"class":163,"line":375},5,[161,377,197],{"emptyLinePlaceholder":196},[161,379,381],{"class":163,"line":380},6,[161,382,383],{"class":306},"# Bad — too narrow, too vague, or redundant\n",[161,385,387,389,391,393,395,397,400,402,404],{"class":163,"line":386},7,[161,388,95],{"class":209},[161,390,212],{"class":181},[161,392,239],{"class":209},[161,394,182],{"class":181},[161,396,244],{"class":181},[161,398,399],{"class":218},"notes",[161,401,215],{"class":181},[161,403,134],{"class":181},[161,405,406],{"class":306},"         # what happens when you add Tags, Users?\n",[161,408,410,412,414,416,418,420,423,425,427],{"class":163,"line":409},8,[161,411,95],{"class":209},[161,413,212],{"class":181},[161,415,239],{"class":209},[161,417,182],{"class":181},[161,419,244],{"class":181},[161,421,422],{"class":218},"data",[161,424,215],{"class":181},[161,426,134],{"class":181},[161,428,429],{"class":306},"          # meaningless\n",[161,431,433,435,437,439,441,443,446,448,450],{"class":163,"line":432},9,[161,434,95],{"class":209},[161,436,212],{"class":181},[161,438,239],{"class":209},[161,440,182],{"class":181},[161,442,244],{"class":181},[161,444,445],{"class":218},"my_objects",[161,447,215],{"class":181},[161,449,134],{"class":181},[161,451,452],{"class":306},"    # table becomes my_objects_objects\n",[454,455,457],"h3",{"id":456},"one-collection-or-many","One collection or many?",[112,459,460,463,464,466,467,471],{},[125,461,462],{},"Start with one collection per project."," Multiple model types in one collection work well — ",[128,465,291],{}," separates them, and ",[468,469,470],"a",{"href":44},"views"," let you query each type independently with SQL.",[112,473,474,475,478,479,481,482,484,485,487,488,490],{},"You ",[125,476,477],{},"must"," use separate collections when mixing ",[128,480,133],{}," with ",[128,483,145],{},", because ",[128,486,95],{}," and ",[128,489,141],{}," enforce their respective types.",[112,492,493,494,497],{},"Beyond that, consider an additional collection when you have unrelated domains in the same database, extreme write-volume skew, or independent data retention needs. The ",[468,495,79],{"href":496},"/advanced/performance#split-collections-for-table-level-performance"," covers each scenario in detail with examples.",[499,500,501,502,505,506,508,509,280,512,280,515,518,519,522],"warning",{},"Do ",[125,503,504],{},"not"," split collections for organizational tidiness alone — ",[128,507,291],{}," and views already separate model types logically. Parent–child relationships (",[128,510,511],{},"parent_ref",[128,513,514],{},"write_child",[128,516,517],{},"children_of",") only work ",[125,520,521],{},"within a single collection",". Splitting related models across collections breaks them.",[147,524,526],{"id":525},"storing-objects","Storing objects",[112,528,529],{},"Let's define a model and write some data:",[152,531,533],{"className":154,"code":532,"language":156,"meta":157,"style":157},"class Product(CentauroModel):\n    __centauro_name__ = \"Product\"\n    name: str = \"\"\n    category: str = \"\"\n    price: float = 0.0\n    in_stock: bool = True\n\nlaptop = Product(name=\"ThinkPad X1\", category=\"electronics\", price=1299.99)\ncoll.write_object(laptop)\n\nprint(laptop.row.id)          # 1 — auto-assigned after write\nprint(laptop.row.write_time)  # datetime of the insert\n",[128,534,535,552,567,584,597,613,628,632,682,700,705,731],{"__ignoreMap":157},[161,536,537,541,545,547,549],{"class":163,"line":164},[161,538,540],{"class":539},"spNyl","class",[161,542,544],{"class":543},"sBMFI"," Product",[161,546,212],{"class":181},[161,548,133],{"class":543},[161,550,551],{"class":181},"):\n",[161,553,554,557,559,561,564],{"class":163,"line":193},[161,555,556],{"class":171},"    __centauro_name__ ",[161,558,206],{"class":181},[161,560,244],{"class":181},[161,562,563],{"class":218},"Product",[161,565,566],{"class":181},"\"\n",[161,568,569,572,575,578,581],{"class":163,"line":200},[161,570,571],{"class":171},"    name",[161,573,574],{"class":181},":",[161,576,577],{"class":543}," str",[161,579,580],{"class":181}," =",[161,582,583],{"class":181}," \"\"\n",[161,585,586,589,591,593,595],{"class":163,"line":227},[161,587,588],{"class":171},"    category",[161,590,574],{"class":181},[161,592,577],{"class":543},[161,594,580],{"class":181},[161,596,583],{"class":181},[161,598,599,602,604,607,609],{"class":163,"line":375},[161,600,601],{"class":171},"    price",[161,603,574],{"class":181},[161,605,606],{"class":543}," float",[161,608,580],{"class":181},[161,610,612],{"class":611},"sbssI"," 0.0\n",[161,614,615,618,620,623,625],{"class":163,"line":380},[161,616,617],{"class":171},"    in_stock",[161,619,574],{"class":181},[161,621,622],{"class":543}," bool",[161,624,580],{"class":181},[161,626,627],{"class":181}," True\n",[161,629,630],{"class":163,"line":386},[161,631,197],{"emptyLinePlaceholder":196},[161,633,634,637,639,641,643,647,649,651,654,656,658,661,663,665,668,670,672,675,677,680],{"class":163,"line":409},[161,635,636],{"class":171},"laptop ",[161,638,206],{"class":181},[161,640,544],{"class":209},[161,642,212],{"class":181},[161,644,646],{"class":645},"sHdIc","name",[161,648,206],{"class":181},[161,650,215],{"class":181},[161,652,653],{"class":218},"ThinkPad X1",[161,655,215],{"class":181},[161,657,182],{"class":181},[161,659,660],{"class":645}," category",[161,662,206],{"class":181},[161,664,215],{"class":181},[161,666,667],{"class":218},"electronics",[161,669,215],{"class":181},[161,671,182],{"class":181},[161,673,674],{"class":645}," price",[161,676,206],{"class":181},[161,678,679],{"class":611},"1299.99",[161,681,224],{"class":181},[161,683,684,687,690,693,695,698],{"class":163,"line":432},[161,685,686],{"class":171},"coll",[161,688,689],{"class":181},".",[161,691,692],{"class":209},"write_object",[161,694,212],{"class":181},[161,696,697],{"class":209},"laptop",[161,699,224],{"class":181},[161,701,703],{"class":163,"line":702},10,[161,704,197],{"emptyLinePlaceholder":196},[161,706,708,711,713,715,717,721,723,726,728],{"class":163,"line":707},11,[161,709,710],{"class":209},"print",[161,712,212],{"class":181},[161,714,697],{"class":209},[161,716,689],{"class":181},[161,718,720],{"class":719},"swJcz","row",[161,722,689],{"class":181},[161,724,725],{"class":719},"id",[161,727,134],{"class":181},[161,729,730],{"class":306},"          # 1 — auto-assigned after write\n",[161,732,734,736,738,740,742,744,746,749,751],{"class":163,"line":733},12,[161,735,710],{"class":209},[161,737,212],{"class":181},[161,739,697],{"class":209},[161,741,689],{"class":181},[161,743,720],{"class":719},[161,745,689],{"class":181},[161,747,748],{"class":719},"write_time",[161,750,134],{"class":181},[161,752,753],{"class":306},"  # datetime of the insert\n",[112,755,756,757,759,760,762,763,280,765,280,767,280,769,772],{},"After ",[128,758,692],{},", the object gains a ",[128,761,720],{}," attribute with database metadata (",[128,764,725],{},[128,766,646],{},[128,768,748],{},[128,770,771],{},"edit_time",").",[454,774,776],{"id":775},"batch-writes","Batch writes",[112,778,779],{},"Insert multiple objects in a single atomic transaction. If any object fails, none are persisted:",[152,781,783],{"className":154,"code":782,"language":156,"meta":157,"style":157},"coll.write_objects([\n    Product(name=\"MacBook Air\", category=\"electronics\", price=999.99),\n    Product(name=\"Standing Desk\", category=\"furniture\", price=549.00),\n    Product(name=\"Monitor Arm\", category=\"furniture\", price=89.99),\n])\n",[128,784,785,797,839,880,920],{"__ignoreMap":157},[161,786,787,789,791,794],{"class":163,"line":164},[161,788,686],{"class":171},[161,790,689],{"class":181},[161,792,793],{"class":209},"write_objects",[161,795,796],{"class":181},"([\n",[161,798,799,802,804,806,808,810,813,815,817,819,821,823,825,827,829,831,833,836],{"class":163,"line":193},[161,800,801],{"class":209},"    Product",[161,803,212],{"class":181},[161,805,646],{"class":645},[161,807,206],{"class":181},[161,809,215],{"class":181},[161,811,812],{"class":218},"MacBook Air",[161,814,215],{"class":181},[161,816,182],{"class":181},[161,818,660],{"class":645},[161,820,206],{"class":181},[161,822,215],{"class":181},[161,824,667],{"class":218},[161,826,215],{"class":181},[161,828,182],{"class":181},[161,830,674],{"class":645},[161,832,206],{"class":181},[161,834,835],{"class":611},"999.99",[161,837,838],{"class":181},"),\n",[161,840,841,843,845,847,849,851,854,856,858,860,862,864,867,869,871,873,875,878],{"class":163,"line":200},[161,842,801],{"class":209},[161,844,212],{"class":181},[161,846,646],{"class":645},[161,848,206],{"class":181},[161,850,215],{"class":181},[161,852,853],{"class":218},"Standing Desk",[161,855,215],{"class":181},[161,857,182],{"class":181},[161,859,660],{"class":645},[161,861,206],{"class":181},[161,863,215],{"class":181},[161,865,866],{"class":218},"furniture",[161,868,215],{"class":181},[161,870,182],{"class":181},[161,872,674],{"class":645},[161,874,206],{"class":181},[161,876,877],{"class":611},"549.00",[161,879,838],{"class":181},[161,881,882,884,886,888,890,892,895,897,899,901,903,905,907,909,911,913,915,918],{"class":163,"line":227},[161,883,801],{"class":209},[161,885,212],{"class":181},[161,887,646],{"class":645},[161,889,206],{"class":181},[161,891,215],{"class":181},[161,893,894],{"class":218},"Monitor Arm",[161,896,215],{"class":181},[161,898,182],{"class":181},[161,900,660],{"class":645},[161,902,206],{"class":181},[161,904,215],{"class":181},[161,906,866],{"class":218},[161,908,215],{"class":181},[161,910,182],{"class":181},[161,912,674],{"class":645},[161,914,206],{"class":181},[161,916,917],{"class":611},"89.99",[161,919,838],{"class":181},[161,921,922],{"class":163,"line":375},[161,923,924],{"class":181},"])\n",[454,926,928],{"id":927},"re-inserting-an-object","Re-inserting an object",[112,930,931,932,935,936,939],{},"Calling ",[128,933,934],{},"write_object()"," on an already-persisted object raises ",[128,937,938],{},"ObjectAlreadyPersistedError",". You have two options:",[152,941,943],{"className":154,"code":942,"language":156,"meta":157,"style":157},"# Option 1: Update the existing row\nlaptop.price = 1199.99\ncoll.update_object(laptop)\n\n# Option 2: Insert a duplicate row (new id)\ncoll.write_object(laptop, duplicate=True)\n",[128,944,945,950,964,979,983,988],{"__ignoreMap":157},[161,946,947],{"class":163,"line":164},[161,948,949],{"class":306},"# Option 1: Update the existing row\n",[161,951,952,954,956,959,961],{"class":163,"line":193},[161,953,697],{"class":171},[161,955,689],{"class":181},[161,957,958],{"class":719},"price",[161,960,580],{"class":181},[161,962,963],{"class":611}," 1199.99\n",[161,965,966,968,970,973,975,977],{"class":163,"line":200},[161,967,686],{"class":171},[161,969,689],{"class":181},[161,971,972],{"class":209},"update_object",[161,974,212],{"class":181},[161,976,697],{"class":209},[161,978,224],{"class":181},[161,980,981],{"class":163,"line":227},[161,982,197],{"emptyLinePlaceholder":196},[161,984,985],{"class":163,"line":375},[161,986,987],{"class":306},"# Option 2: Insert a duplicate row (new id)\n",[161,989,990,992,994,996,998,1000,1002,1005],{"class":163,"line":380},[161,991,686],{"class":171},[161,993,689],{"class":181},[161,995,692],{"class":209},[161,997,212],{"class":181},[161,999,697],{"class":209},[161,1001,182],{"class":181},[161,1003,1004],{"class":645}," duplicate",[161,1006,1007],{"class":181},"=True)\n",[147,1009,1011],{"id":1010},"reading-objects-back","Reading objects back",[454,1013,1015],{"id":1014},"by-id","By id",[112,1017,1018],{},"Fetch a single object when you know its row id:",[152,1020,1022],{"className":154,"code":1021,"language":156,"meta":157,"style":157},"loaded = coll.read_object_by_id(1, Product)\nprint(loaded.name)   # \"ThinkPad X1\"\nprint(loaded.price)  # 1299.99\n",[128,1023,1024,1050,1068],{"__ignoreMap":157},[161,1025,1026,1029,1031,1034,1036,1039,1041,1044,1046,1048],{"class":163,"line":164},[161,1027,1028],{"class":171},"loaded ",[161,1030,206],{"class":181},[161,1032,1033],{"class":171}," coll",[161,1035,689],{"class":181},[161,1037,1038],{"class":209},"read_object_by_id",[161,1040,212],{"class":181},[161,1042,1043],{"class":611},"1",[161,1045,182],{"class":181},[161,1047,544],{"class":209},[161,1049,224],{"class":181},[161,1051,1052,1054,1056,1059,1061,1063,1065],{"class":163,"line":193},[161,1053,710],{"class":209},[161,1055,212],{"class":181},[161,1057,1058],{"class":209},"loaded",[161,1060,689],{"class":181},[161,1062,646],{"class":719},[161,1064,134],{"class":181},[161,1066,1067],{"class":306},"   # \"ThinkPad X1\"\n",[161,1069,1070,1072,1074,1076,1078,1080,1082],{"class":163,"line":200},[161,1071,710],{"class":209},[161,1073,212],{"class":181},[161,1075,1058],{"class":209},[161,1077,689],{"class":181},[161,1079,958],{"class":719},[161,1081,134],{"class":181},[161,1083,1084],{"class":306},"  # 1299.99\n",[112,1086,1087,1088,1091],{},"Pass ",[128,1089,1090],{},"raw=True"," to get the database row as a dict instead of a hydrated model — useful for debugging or when you need the raw JSON:",[152,1093,1095],{"className":154,"code":1094,"language":156,"meta":157,"style":157},"row = coll.read_object_by_id(1, Product, raw=True)\nprint(row[\"meta\"])  # '{\"name\":\"ThinkPad X1\",\"category\":\"electronics\",...}'\n",[128,1096,1097,1125],{"__ignoreMap":157},[161,1098,1099,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1123],{"class":163,"line":164},[161,1100,1101],{"class":171},"row ",[161,1103,206],{"class":181},[161,1105,1033],{"class":171},[161,1107,689],{"class":181},[161,1109,1038],{"class":209},[161,1111,212],{"class":181},[161,1113,1043],{"class":611},[161,1115,182],{"class":181},[161,1117,544],{"class":209},[161,1119,182],{"class":181},[161,1121,1122],{"class":645}," raw",[161,1124,1007],{"class":181},[161,1126,1127,1129,1131,1133,1136,1138,1141,1143,1146],{"class":163,"line":193},[161,1128,710],{"class":209},[161,1130,212],{"class":181},[161,1132,720],{"class":209},[161,1134,1135],{"class":181},"[",[161,1137,215],{"class":181},[161,1139,1140],{"class":218},"meta",[161,1142,215],{"class":181},[161,1144,1145],{"class":181},"])",[161,1147,1148],{"class":306},"  # '{\"name\":\"ThinkPad X1\",\"category\":\"electronics\",...}'\n",[454,1150,1152],{"id":1151},"the-latest-object","The latest object",[112,1154,1155],{},"Retrieve the most recently edited object of a given type:",[152,1157,1159],{"className":154,"code":1158,"language":156,"meta":157,"style":157},"latest = coll.read_latest_object(Product)\nprint(latest.name)  # the last-updated Product\n",[128,1160,1161,1181],{"__ignoreMap":157},[161,1162,1163,1166,1168,1170,1172,1175,1177,1179],{"class":163,"line":164},[161,1164,1165],{"class":171},"latest ",[161,1167,206],{"class":181},[161,1169,1033],{"class":171},[161,1171,689],{"class":181},[161,1173,1174],{"class":209},"read_latest_object",[161,1176,212],{"class":181},[161,1178,563],{"class":209},[161,1180,224],{"class":181},[161,1182,1183,1185,1187,1190,1192,1194,1196],{"class":163,"line":193},[161,1184,710],{"class":209},[161,1186,212],{"class":181},[161,1188,1189],{"class":209},"latest",[161,1191,689],{"class":181},[161,1193,646],{"class":719},[161,1195,134],{"class":181},[161,1197,1198],{"class":306},"  # the last-updated Product\n",[112,1200,1201,1202,1205],{},"Returns ",[128,1203,1204],{},"None"," if no objects of that type exist. You can also filter:",[152,1207,1209],{"className":154,"code":1208,"language":156,"meta":157,"style":157},"# Latest electronics product\nlatest_electronics = coll.read_latest_object(\n    Product.fields.category == \"electronics\"\n)\n",[128,1210,1211,1216,1232,1255],{"__ignoreMap":157},[161,1212,1213],{"class":163,"line":164},[161,1214,1215],{"class":306},"# Latest electronics product\n",[161,1217,1218,1221,1223,1225,1227,1229],{"class":163,"line":193},[161,1219,1220],{"class":171},"latest_electronics ",[161,1222,206],{"class":181},[161,1224,1033],{"class":171},[161,1226,689],{"class":181},[161,1228,1174],{"class":209},[161,1230,1231],{"class":181},"(\n",[161,1233,1234,1236,1238,1241,1243,1246,1249,1251,1253],{"class":163,"line":200},[161,1235,801],{"class":209},[161,1237,689],{"class":181},[161,1239,1240],{"class":719},"fields",[161,1242,689],{"class":181},[161,1244,1245],{"class":719},"category",[161,1247,1248],{"class":181}," ==",[161,1250,244],{"class":181},[161,1252,667],{"class":218},[161,1254,566],{"class":181},[161,1256,1257],{"class":163,"line":227},[161,1258,224],{"class":181},[454,1260,1262],{"id":1261},"querying-with-conditions","Querying with conditions",[112,1264,1265,1266,1269],{},"This is where CentauroDB's query DSL shines. Use ",[128,1267,1268],{},"Model.fields"," to build type-safe conditions:",[152,1271,1273],{"className":154,"code":1272,"language":156,"meta":157,"style":157},"# All products\nall_products = coll.read_objects(Product)\n\n# Filter by equality\nelectronics = coll.read_objects(\n    Product.fields.category == \"electronics\"\n)\n\n# Combine multiple conditions (AND)\ncheap_electronics = coll.read_objects(\n    Product.fields.category == \"electronics\",\n    Product.fields.price \u003C 1000,\n)\n",[128,1274,1275,1280,1300,1304,1309,1324,1344,1348,1352,1357,1372,1395,1415],{"__ignoreMap":157},[161,1276,1277],{"class":163,"line":164},[161,1278,1279],{"class":306},"# All products\n",[161,1281,1282,1285,1287,1289,1291,1294,1296,1298],{"class":163,"line":193},[161,1283,1284],{"class":171},"all_products ",[161,1286,206],{"class":181},[161,1288,1033],{"class":171},[161,1290,689],{"class":181},[161,1292,1293],{"class":209},"read_objects",[161,1295,212],{"class":181},[161,1297,563],{"class":209},[161,1299,224],{"class":181},[161,1301,1302],{"class":163,"line":200},[161,1303,197],{"emptyLinePlaceholder":196},[161,1305,1306],{"class":163,"line":227},[161,1307,1308],{"class":306},"# Filter by equality\n",[161,1310,1311,1314,1316,1318,1320,1322],{"class":163,"line":375},[161,1312,1313],{"class":171},"electronics ",[161,1315,206],{"class":181},[161,1317,1033],{"class":171},[161,1319,689],{"class":181},[161,1321,1293],{"class":209},[161,1323,1231],{"class":181},[161,1325,1326,1328,1330,1332,1334,1336,1338,1340,1342],{"class":163,"line":380},[161,1327,801],{"class":209},[161,1329,689],{"class":181},[161,1331,1240],{"class":719},[161,1333,689],{"class":181},[161,1335,1245],{"class":719},[161,1337,1248],{"class":181},[161,1339,244],{"class":181},[161,1341,667],{"class":218},[161,1343,566],{"class":181},[161,1345,1346],{"class":163,"line":386},[161,1347,224],{"class":181},[161,1349,1350],{"class":163,"line":409},[161,1351,197],{"emptyLinePlaceholder":196},[161,1353,1354],{"class":163,"line":432},[161,1355,1356],{"class":306},"# Combine multiple conditions (AND)\n",[161,1358,1359,1362,1364,1366,1368,1370],{"class":163,"line":702},[161,1360,1361],{"class":171},"cheap_electronics ",[161,1363,206],{"class":181},[161,1365,1033],{"class":171},[161,1367,689],{"class":181},[161,1369,1293],{"class":209},[161,1371,1231],{"class":181},[161,1373,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392],{"class":163,"line":707},[161,1375,801],{"class":209},[161,1377,689],{"class":181},[161,1379,1240],{"class":719},[161,1381,689],{"class":181},[161,1383,1245],{"class":719},[161,1385,1248],{"class":181},[161,1387,244],{"class":181},[161,1389,667],{"class":218},[161,1391,215],{"class":181},[161,1393,1394],{"class":181},",\n",[161,1396,1397,1399,1401,1403,1405,1407,1410,1413],{"class":163,"line":733},[161,1398,801],{"class":209},[161,1400,689],{"class":181},[161,1402,1240],{"class":719},[161,1404,689],{"class":181},[161,1406,958],{"class":719},[161,1408,1409],{"class":181}," \u003C",[161,1411,1412],{"class":611}," 1000",[161,1414,1394],{"class":181},[161,1416,1418],{"class":163,"line":1417},13,[161,1419,224],{"class":181},[454,1421,1423,1424],{"id":1422},"pattern-matching-with-like","Pattern matching with ",[128,1425,1426],{},"like",[112,1428,1429,1430,1433],{},"Use SQL ",[128,1431,1432],{},"LIKE"," patterns for partial string matches:",[152,1435,1437],{"className":154,"code":1436,"language":156,"meta":157,"style":157},"# Products with names starting with \"Mac\"\nmacs = coll.read_objects(\n    Product.fields.name.like(\"Mac%\")\n)\n\n# Products with \"Desk\" anywhere in the name\ndesks = coll.read_objects(\n    Product.fields.name.like(\"%Desk%\")\n)\n",[128,1438,1439,1444,1459,1486,1490,1494,1499,1514,1541],{"__ignoreMap":157},[161,1440,1441],{"class":163,"line":164},[161,1442,1443],{"class":306},"# Products with names starting with \"Mac\"\n",[161,1445,1446,1449,1451,1453,1455,1457],{"class":163,"line":193},[161,1447,1448],{"class":171},"macs ",[161,1450,206],{"class":181},[161,1452,1033],{"class":171},[161,1454,689],{"class":181},[161,1456,1293],{"class":209},[161,1458,1231],{"class":181},[161,1460,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1482,1484],{"class":163,"line":200},[161,1462,801],{"class":209},[161,1464,689],{"class":181},[161,1466,1240],{"class":719},[161,1468,689],{"class":181},[161,1470,646],{"class":719},[161,1472,689],{"class":181},[161,1474,1426],{"class":209},[161,1476,212],{"class":181},[161,1478,215],{"class":181},[161,1480,1481],{"class":218},"Mac%",[161,1483,215],{"class":181},[161,1485,224],{"class":181},[161,1487,1488],{"class":163,"line":227},[161,1489,224],{"class":181},[161,1491,1492],{"class":163,"line":375},[161,1493,197],{"emptyLinePlaceholder":196},[161,1495,1496],{"class":163,"line":380},[161,1497,1498],{"class":306},"# Products with \"Desk\" anywhere in the name\n",[161,1500,1501,1504,1506,1508,1510,1512],{"class":163,"line":386},[161,1502,1503],{"class":171},"desks ",[161,1505,206],{"class":181},[161,1507,1033],{"class":171},[161,1509,689],{"class":181},[161,1511,1293],{"class":209},[161,1513,1231],{"class":181},[161,1515,1516,1518,1520,1522,1524,1526,1528,1530,1532,1534,1537,1539],{"class":163,"line":409},[161,1517,801],{"class":209},[161,1519,689],{"class":181},[161,1521,1240],{"class":719},[161,1523,689],{"class":181},[161,1525,646],{"class":719},[161,1527,689],{"class":181},[161,1529,1426],{"class":209},[161,1531,212],{"class":181},[161,1533,215],{"class":181},[161,1535,1536],{"class":218},"%Desk%",[161,1538,215],{"class":181},[161,1540,224],{"class":181},[161,1542,1543],{"class":163,"line":432},[161,1544,224],{"class":181},[454,1546,1548,1549],{"id":1547},"matching-a-set-of-values-with-is_in","Matching a set of values with ",[128,1550,1551],{},"is_in",[112,1553,1554],{},"Check if a field matches any value in a list:",[152,1556,1558],{"className":154,"code":1557,"language":156,"meta":157,"style":157},"# Products in specific categories\nresults = coll.read_objects(\n    Product.fields.category.is_in([\"electronics\", \"furniture\"])\n)\n",[128,1559,1560,1565,1580,1615],{"__ignoreMap":157},[161,1561,1562],{"class":163,"line":164},[161,1563,1564],{"class":306},"# Products in specific categories\n",[161,1566,1567,1570,1572,1574,1576,1578],{"class":163,"line":193},[161,1568,1569],{"class":171},"results ",[161,1571,206],{"class":181},[161,1573,1033],{"class":171},[161,1575,689],{"class":181},[161,1577,1293],{"class":209},[161,1579,1231],{"class":181},[161,1581,1582,1584,1586,1588,1590,1592,1594,1596,1599,1601,1603,1605,1607,1609,1611,1613],{"class":163,"line":200},[161,1583,801],{"class":209},[161,1585,689],{"class":181},[161,1587,1240],{"class":719},[161,1589,689],{"class":181},[161,1591,1245],{"class":719},[161,1593,689],{"class":181},[161,1595,1551],{"class":209},[161,1597,1598],{"class":181},"([",[161,1600,215],{"class":181},[161,1602,667],{"class":218},[161,1604,215],{"class":181},[161,1606,182],{"class":181},[161,1608,244],{"class":181},[161,1610,866],{"class":218},[161,1612,215],{"class":181},[161,1614,924],{"class":181},[161,1616,1617],{"class":163,"line":227},[161,1618,224],{"class":181},[454,1620,1622],{"id":1621},"or-conditions","OR conditions",[112,1624,1625,1626,1629],{},"Combine conditions with ",[128,1627,1628],{},"|"," for OR logic:",[152,1631,1633],{"className":154,"code":1632,"language":156,"meta":157,"style":157},"# Cheap OR out-of-stock products\nresults = coll.read_objects(\n    (Product.fields.price \u003C 100) | (Product.fields.in_stock == False),\n)\n\n# OR + AND: cheap or premium electronics\nresults = coll.read_objects(\n    (Product.fields.price \u003C 100) | (Product.fields.price > 1000),\n    Product.fields.category == \"electronics\",\n)\n",[128,1634,1635,1640,1654,1698,1702,1706,1711,1725,1766,1788],{"__ignoreMap":157},[161,1636,1637],{"class":163,"line":164},[161,1638,1639],{"class":306},"# Cheap OR out-of-stock products\n",[161,1641,1642,1644,1646,1648,1650,1652],{"class":163,"line":193},[161,1643,1569],{"class":171},[161,1645,206],{"class":181},[161,1647,1033],{"class":171},[161,1649,689],{"class":181},[161,1651,1293],{"class":209},[161,1653,1231],{"class":181},[161,1655,1656,1659,1661,1663,1665,1667,1669,1671,1674,1676,1679,1682,1684,1686,1688,1690,1693,1695],{"class":163,"line":200},[161,1657,1658],{"class":181},"    (",[161,1660,563],{"class":209},[161,1662,689],{"class":181},[161,1664,1240],{"class":719},[161,1666,689],{"class":181},[161,1668,958],{"class":719},[161,1670,1409],{"class":181},[161,1672,1673],{"class":611}," 100",[161,1675,134],{"class":181},[161,1677,1678],{"class":181}," |",[161,1680,1681],{"class":181}," (",[161,1683,563],{"class":209},[161,1685,689],{"class":181},[161,1687,1240],{"class":719},[161,1689,689],{"class":181},[161,1691,1692],{"class":719},"in_stock",[161,1694,1248],{"class":181},[161,1696,1697],{"class":181}," False),\n",[161,1699,1700],{"class":163,"line":227},[161,1701,224],{"class":181},[161,1703,1704],{"class":163,"line":375},[161,1705,197],{"emptyLinePlaceholder":196},[161,1707,1708],{"class":163,"line":380},[161,1709,1710],{"class":306},"# OR + AND: cheap or premium electronics\n",[161,1712,1713,1715,1717,1719,1721,1723],{"class":163,"line":386},[161,1714,1569],{"class":171},[161,1716,206],{"class":181},[161,1718,1033],{"class":171},[161,1720,689],{"class":181},[161,1722,1293],{"class":209},[161,1724,1231],{"class":181},[161,1726,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753,1755,1757,1759,1762,1764],{"class":163,"line":409},[161,1728,1658],{"class":181},[161,1730,563],{"class":209},[161,1732,689],{"class":181},[161,1734,1240],{"class":719},[161,1736,689],{"class":181},[161,1738,958],{"class":719},[161,1740,1409],{"class":181},[161,1742,1673],{"class":611},[161,1744,134],{"class":181},[161,1746,1678],{"class":181},[161,1748,1681],{"class":181},[161,1750,563],{"class":209},[161,1752,689],{"class":181},[161,1754,1240],{"class":719},[161,1756,689],{"class":181},[161,1758,958],{"class":719},[161,1760,1761],{"class":181}," >",[161,1763,1412],{"class":611},[161,1765,838],{"class":181},[161,1767,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786],{"class":163,"line":432},[161,1769,801],{"class":209},[161,1771,689],{"class":181},[161,1773,1240],{"class":719},[161,1775,689],{"class":181},[161,1777,1245],{"class":719},[161,1779,1248],{"class":181},[161,1781,244],{"class":181},[161,1783,667],{"class":218},[161,1785,215],{"class":181},[161,1787,1394],{"class":181},[161,1789,1790],{"class":163,"line":702},[161,1791,224],{"class":181},[454,1793,1795,1796,1799,1800],{"id":1794},"aggregates-max_field-min_field","Aggregates: ",[128,1797,1798],{},"max_field"," / ",[128,1801,1802],{},"min_field",[112,1804,1805],{},"Find the row(s) with the maximum or minimum value of a numeric or datetime field:",[152,1807,1809],{"className":154,"code":1808,"language":156,"meta":157,"style":157},"# Most expensive product\npriciest = coll.read_objects(Product, max_field=Product.fields.price)\n\n# Cheapest electronics product\ncheapest = coll.read_objects(\n    Product.fields.category == \"electronics\",\n    min_field=Product.fields.price,\n)\n\n# Oldest product by write_time\noldest = coll.read_objects(Product, min_field=Product.fields.write_time)\n",[128,1810,1811,1816,1852,1856,1861,1876,1898,1917,1921,1925,1930],{"__ignoreMap":157},[161,1812,1813],{"class":163,"line":164},[161,1814,1815],{"class":306},"# Most expensive product\n",[161,1817,1818,1821,1823,1825,1827,1829,1831,1833,1835,1838,1840,1842,1844,1846,1848,1850],{"class":163,"line":193},[161,1819,1820],{"class":171},"priciest ",[161,1822,206],{"class":181},[161,1824,1033],{"class":171},[161,1826,689],{"class":181},[161,1828,1293],{"class":209},[161,1830,212],{"class":181},[161,1832,563],{"class":209},[161,1834,182],{"class":181},[161,1836,1837],{"class":645}," max_field",[161,1839,206],{"class":181},[161,1841,563],{"class":209},[161,1843,689],{"class":181},[161,1845,1240],{"class":719},[161,1847,689],{"class":181},[161,1849,958],{"class":719},[161,1851,224],{"class":181},[161,1853,1854],{"class":163,"line":200},[161,1855,197],{"emptyLinePlaceholder":196},[161,1857,1858],{"class":163,"line":227},[161,1859,1860],{"class":306},"# Cheapest electronics product\n",[161,1862,1863,1866,1868,1870,1872,1874],{"class":163,"line":375},[161,1864,1865],{"class":171},"cheapest ",[161,1867,206],{"class":181},[161,1869,1033],{"class":171},[161,1871,689],{"class":181},[161,1873,1293],{"class":209},[161,1875,1231],{"class":181},[161,1877,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896],{"class":163,"line":380},[161,1879,801],{"class":209},[161,1881,689],{"class":181},[161,1883,1240],{"class":719},[161,1885,689],{"class":181},[161,1887,1245],{"class":719},[161,1889,1248],{"class":181},[161,1891,244],{"class":181},[161,1893,667],{"class":218},[161,1895,215],{"class":181},[161,1897,1394],{"class":181},[161,1899,1900,1903,1905,1907,1909,1911,1913,1915],{"class":163,"line":386},[161,1901,1902],{"class":645},"    min_field",[161,1904,206],{"class":181},[161,1906,563],{"class":209},[161,1908,689],{"class":181},[161,1910,1240],{"class":719},[161,1912,689],{"class":181},[161,1914,958],{"class":719},[161,1916,1394],{"class":181},[161,1918,1919],{"class":163,"line":409},[161,1920,224],{"class":181},[161,1922,1923],{"class":163,"line":432},[161,1924,197],{"emptyLinePlaceholder":196},[161,1926,1927],{"class":163,"line":702},[161,1928,1929],{"class":306},"# Oldest product by write_time\n",[161,1931,1932,1935,1937,1939,1941,1943,1945,1947,1949,1952,1954,1956,1958,1960,1962,1964],{"class":163,"line":707},[161,1933,1934],{"class":171},"oldest ",[161,1936,206],{"class":181},[161,1938,1033],{"class":171},[161,1940,689],{"class":181},[161,1942,1293],{"class":209},[161,1944,212],{"class":181},[161,1946,563],{"class":209},[161,1948,182],{"class":181},[161,1950,1951],{"class":645}," min_field",[161,1953,206],{"class":181},[161,1955,563],{"class":209},[161,1957,689],{"class":181},[161,1959,1240],{"class":719},[161,1961,689],{"class":181},[161,1963,748],{"class":719},[161,1965,224],{"class":181},[1967,1968,1969,487,1971,1973,1974,280,1977,280,1980,1983,1984,1987],"callout",{"icon":14},[128,1970,1798],{},[128,1972,1802],{}," are mutually exclusive — pass only one at a time. They work with ",[128,1975,1976],{},"int",[128,1978,1979],{},"float",[128,1981,1982],{},"date",", and ",[128,1985,1986],{},"datetime"," fields.",[454,1989,1991],{"id":1990},"counting-and-pagination","Counting and pagination",[112,1993,1994],{},"Count matching objects without loading any rows:",[152,1996,1998],{"className":154,"code":1997,"language":156,"meta":157,"style":157},"total = coll.count_objects(Product)\nin_stock = coll.count_objects(Product.fields.in_stock == True)\n\n# Equivalent via the aggregate API\ntotal = coll.aggregate(Product, count=True)\n",[128,1999,2000,2020,2050,2054,2059],{"__ignoreMap":157},[161,2001,2002,2005,2007,2009,2011,2014,2016,2018],{"class":163,"line":164},[161,2003,2004],{"class":171},"total ",[161,2006,206],{"class":181},[161,2008,1033],{"class":171},[161,2010,689],{"class":181},[161,2012,2013],{"class":209},"count_objects",[161,2015,212],{"class":181},[161,2017,563],{"class":209},[161,2019,224],{"class":181},[161,2021,2022,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047],{"class":163,"line":193},[161,2023,2024],{"class":171},"in_stock ",[161,2026,206],{"class":181},[161,2028,1033],{"class":171},[161,2030,689],{"class":181},[161,2032,2013],{"class":209},[161,2034,212],{"class":181},[161,2036,563],{"class":209},[161,2038,689],{"class":181},[161,2040,1240],{"class":719},[161,2042,689],{"class":181},[161,2044,1692],{"class":719},[161,2046,1248],{"class":181},[161,2048,2049],{"class":181}," True)\n",[161,2051,2052],{"class":163,"line":200},[161,2053,197],{"emptyLinePlaceholder":196},[161,2055,2056],{"class":163,"line":227},[161,2057,2058],{"class":306},"# Equivalent via the aggregate API\n",[161,2060,2061,2063,2065,2067,2069,2072,2074,2076,2078,2081],{"class":163,"line":375},[161,2062,2004],{"class":171},[161,2064,206],{"class":181},[161,2066,1033],{"class":171},[161,2068,689],{"class":181},[161,2070,2071],{"class":209},"aggregate",[161,2073,212],{"class":181},[161,2075,563],{"class":209},[161,2077,182],{"class":181},[161,2079,2080],{"class":645}," count",[161,2082,1007],{"class":181},[112,2084,2085,2086,1799,2089,2092,2093,2095],{},"Page through large result sets with ",[128,2087,2088],{},"limit",[128,2090,2091],{},"offset"," — ",[128,2094,2013],{}," gives you the total for the pager:",[152,2097,2099],{"className":154,"code":2098,"language":156,"meta":157,"style":157},"page_size = 20\ntotal = coll.count_objects(Product)\n\npage_1 = coll.read_objects(Product, limit=page_size)\npage_3 = coll.read_objects(Product, limit=page_size, offset=2 * page_size)\n",[128,2100,2101,2111,2129,2133,2162],{"__ignoreMap":157},[161,2102,2103,2106,2108],{"class":163,"line":164},[161,2104,2105],{"class":171},"page_size ",[161,2107,206],{"class":181},[161,2109,2110],{"class":611}," 20\n",[161,2112,2113,2115,2117,2119,2121,2123,2125,2127],{"class":163,"line":193},[161,2114,2004],{"class":171},[161,2116,206],{"class":181},[161,2118,1033],{"class":171},[161,2120,689],{"class":181},[161,2122,2013],{"class":209},[161,2124,212],{"class":181},[161,2126,563],{"class":209},[161,2128,224],{"class":181},[161,2130,2131],{"class":163,"line":200},[161,2132,197],{"emptyLinePlaceholder":196},[161,2134,2135,2138,2140,2142,2144,2146,2148,2150,2152,2155,2157,2160],{"class":163,"line":227},[161,2136,2137],{"class":171},"page_1 ",[161,2139,206],{"class":181},[161,2141,1033],{"class":171},[161,2143,689],{"class":181},[161,2145,1293],{"class":209},[161,2147,212],{"class":181},[161,2149,563],{"class":209},[161,2151,182],{"class":181},[161,2153,2154],{"class":645}," limit",[161,2156,206],{"class":181},[161,2158,2159],{"class":209},"page_size",[161,2161,224],{"class":181},[161,2163,2164,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187,2189,2192,2194,2197,2200,2203],{"class":163,"line":375},[161,2165,2166],{"class":171},"page_3 ",[161,2168,206],{"class":181},[161,2170,1033],{"class":171},[161,2172,689],{"class":181},[161,2174,1293],{"class":209},[161,2176,212],{"class":181},[161,2178,563],{"class":209},[161,2180,182],{"class":181},[161,2182,2154],{"class":645},[161,2184,206],{"class":181},[161,2186,2159],{"class":209},[161,2188,182],{"class":181},[161,2190,2191],{"class":645}," offset",[161,2193,206],{"class":181},[161,2195,2196],{"class":611},"2",[161,2198,2199],{"class":181}," *",[161,2201,2202],{"class":209}," page_size",[161,2204,224],{"class":181},[112,2206,2207,2209,2210,2212,2213,689],{},[128,2208,2091],{}," requires ",[128,2211,2088],{}," — pagination without an upper bound raises ",[128,2214,2215],{},"ValueError",[499,2217,2218,2219,2222,2223,2092,2226,280,2229,1983,2232,2235,2236,2239,2240,2243,2244,689],{},"As of 0.9.0 only ",[128,2220,2221],{},"count=True"," is implemented in ",[128,2224,2225],{},"aggregate()",[128,2227,2228],{},"sum",[128,2230,2231],{},"avg",[128,2233,2234],{},"group_by"," are reserved and raise ",[128,2237,2238],{},"NotImplementedError",". For SQL aggregations today, create a ",[468,2241,2242],{"href":44},"view"," and query it with ",[128,2245,2246],{},"sql_select()",[147,2248,2250],{"id":2249},"updating-objects","Updating objects",[112,2252,2253,2254,2256,2257,2259],{},"Modify fields on a loaded object and persist the changes. The ",[128,2255,771],{}," is updated automatically; ",[128,2258,748],{}," is preserved:",[152,2261,2263],{"className":154,"code":2262,"language":156,"meta":157,"style":157},"loaded = coll.read_object_by_id(1, Product)\nloaded.price = 1099.99\nloaded.in_stock = False\ncoll.update_object(loaded)\n",[128,2264,2265,2287,2300,2313],{"__ignoreMap":157},[161,2266,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285],{"class":163,"line":164},[161,2268,1028],{"class":171},[161,2270,206],{"class":181},[161,2272,1033],{"class":171},[161,2274,689],{"class":181},[161,2276,1038],{"class":209},[161,2278,212],{"class":181},[161,2280,1043],{"class":611},[161,2282,182],{"class":181},[161,2284,544],{"class":209},[161,2286,224],{"class":181},[161,2288,2289,2291,2293,2295,2297],{"class":163,"line":193},[161,2290,1058],{"class":171},[161,2292,689],{"class":181},[161,2294,958],{"class":719},[161,2296,580],{"class":181},[161,2298,2299],{"class":611}," 1099.99\n",[161,2301,2302,2304,2306,2308,2310],{"class":163,"line":200},[161,2303,1058],{"class":171},[161,2305,689],{"class":181},[161,2307,1692],{"class":719},[161,2309,580],{"class":181},[161,2311,2312],{"class":181}," False\n",[161,2314,2315,2317,2319,2321,2323,2325],{"class":163,"line":227},[161,2316,686],{"class":171},[161,2318,689],{"class":181},[161,2320,972],{"class":209},[161,2322,212],{"class":181},[161,2324,1058],{"class":209},[161,2326,224],{"class":181},[499,2328,931,2329,2332,2333,689],{},[128,2330,2331],{},"update_object()"," on an object that hasn't been written raises ",[468,2334,2336],{"href":2335},"/api/exceptions#objectnotpersistederror",[128,2337,2338],{},"ObjectNotPersistedError",[147,2340,2342],{"id":2341},"deleting-objects","Deleting objects",[112,2344,2345],{},"Remove a single object by passing the persisted instance:",[152,2347,2349],{"className":154,"code":2348,"language":156,"meta":157,"style":157},"coll.delete_object(loaded)\n# loaded is no longer persisted — can be re-written if needed\n",[128,2350,2351,2366],{"__ignoreMap":157},[161,2352,2353,2355,2357,2360,2362,2364],{"class":163,"line":164},[161,2354,686],{"class":171},[161,2356,689],{"class":181},[161,2358,2359],{"class":209},"delete_object",[161,2361,212],{"class":181},[161,2363,1058],{"class":209},[161,2365,224],{"class":181},[161,2367,2368],{"class":163,"line":193},[161,2369,2370],{"class":306},"# loaded is no longer persisted — can be re-written if needed\n",[112,2372,2373,2374,2376],{},"Delete multiple objects with conditions (same calling styles as ",[128,2375,1293],{},"):",[152,2378,2380],{"className":154,"code":2379,"language":156,"meta":157,"style":157},"# Delete all furniture\ndeleted_count = coll.delete_objects(\n    Product.fields.category == \"furniture\"\n)\nprint(deleted_count)  # number of rows removed\n\n# Delete all products of a given type\ncoll.delete_objects(Product)\n",[128,2381,2382,2387,2403,2423,2427,2441,2445,2450],{"__ignoreMap":157},[161,2383,2384],{"class":163,"line":164},[161,2385,2386],{"class":306},"# Delete all furniture\n",[161,2388,2389,2392,2394,2396,2398,2401],{"class":163,"line":193},[161,2390,2391],{"class":171},"deleted_count ",[161,2393,206],{"class":181},[161,2395,1033],{"class":171},[161,2397,689],{"class":181},[161,2399,2400],{"class":209},"delete_objects",[161,2402,1231],{"class":181},[161,2404,2405,2407,2409,2411,2413,2415,2417,2419,2421],{"class":163,"line":200},[161,2406,801],{"class":209},[161,2408,689],{"class":181},[161,2410,1240],{"class":719},[161,2412,689],{"class":181},[161,2414,1245],{"class":719},[161,2416,1248],{"class":181},[161,2418,244],{"class":181},[161,2420,866],{"class":218},[161,2422,566],{"class":181},[161,2424,2425],{"class":163,"line":227},[161,2426,224],{"class":181},[161,2428,2429,2431,2433,2436,2438],{"class":163,"line":375},[161,2430,710],{"class":209},[161,2432,212],{"class":181},[161,2434,2435],{"class":209},"deleted_count",[161,2437,134],{"class":181},[161,2439,2440],{"class":306},"  # number of rows removed\n",[161,2442,2443],{"class":163,"line":380},[161,2444,197],{"emptyLinePlaceholder":196},[161,2446,2447],{"class":163,"line":386},[161,2448,2449],{"class":306},"# Delete all products of a given type\n",[161,2451,2452,2454,2456,2458,2460,2462],{"class":163,"line":409},[161,2453,686],{"class":171},[161,2455,689],{"class":181},[161,2457,2400],{"class":209},[161,2459,212],{"class":181},[161,2461,563],{"class":209},[161,2463,224],{"class":181},[499,2465,2466,2469,2470,2474,2475,2469,2477,2483,2484,2487,2488,689],{},[128,2467,2468],{},"delete_object()"," raises ",[468,2471,2472],{"href":2335},[128,2473,2338],{}," if the object hasn't been written yet. Deleting a parent that still has children linked via ",[128,2476,511],{},[468,2478,2480],{"href":2479},"/api/exceptions#parenthaschildrenerror",[128,2481,2482],{},"ParentHasChildrenError"," under the default ",[128,2485,2486],{},"on_delete=\"restrict\""," — see ",[468,2489,2491],{"href":2490},"/essentials/relations#deleting-parents-and-children","Deleting parents and children",[147,2493,2495],{"id":2494},"refreshing-from-the-database","Refreshing from the database",[112,2497,2498],{},"If another process might have updated a row, refresh your in-memory copy:",[152,2500,2502],{"className":154,"code":2501,"language":156,"meta":157,"style":157},"coll.refresh(loaded)\nprint(loaded.price)  # reflects the latest database state\n",[128,2503,2504,2519],{"__ignoreMap":157},[161,2505,2506,2508,2510,2513,2515,2517],{"class":163,"line":164},[161,2507,686],{"class":171},[161,2509,689],{"class":181},[161,2511,2512],{"class":209},"refresh",[161,2514,212],{"class":181},[161,2516,1058],{"class":209},[161,2518,224],{"class":181},[161,2520,2521,2523,2525,2527,2529,2531,2533],{"class":163,"line":193},[161,2522,710],{"class":209},[161,2524,212],{"class":181},[161,2526,1058],{"class":209},[161,2528,689],{"class":181},[161,2530,958],{"class":719},[161,2532,134],{"class":181},[161,2534,2535],{"class":306},"  # reflects the latest database state\n",[147,2537,2539],{"id":2538},"multiple-model-types-in-one-collection","Multiple model types in one collection",[112,2541,2542,2543,2545],{},"You can store different model types in the same collection. CentauroDB uses ",[128,2544,291],{}," to distinguish between them:",[152,2547,2549],{"className":154,"code":2548,"language":156,"meta":157,"style":157},"class Supplier(CentauroModel):\n    __centauro_name__ = \"Supplier\"\n    company: str = \"\"\n    contact: str = \"\"\n\n# Same collection — both types share inventory_objects\ncoll.write_object(Product(name=\"Keyboard\", category=\"electronics\"))\ncoll.write_object(Supplier(company=\"Acme\", contact=\"john@acme.com\"))\n\n# Read back by specifying the model class\nproduct = coll.read_object_by_id(1, Product)\nsupplier = coll.read_object_by_id(2, Supplier)\n\n# Query only products — __centauro_name__ filter is automatic\nall_products = coll.read_objects(Product)\n",[128,2550,2551,2564,2577,2590,2603,2607,2612,2652,2694,2698,2703,2726,2749,2753,2759],{"__ignoreMap":157},[161,2552,2553,2555,2558,2560,2562],{"class":163,"line":164},[161,2554,540],{"class":539},[161,2556,2557],{"class":543}," Supplier",[161,2559,212],{"class":181},[161,2561,133],{"class":543},[161,2563,551],{"class":181},[161,2565,2566,2568,2570,2572,2575],{"class":163,"line":193},[161,2567,556],{"class":171},[161,2569,206],{"class":181},[161,2571,244],{"class":181},[161,2573,2574],{"class":218},"Supplier",[161,2576,566],{"class":181},[161,2578,2579,2582,2584,2586,2588],{"class":163,"line":200},[161,2580,2581],{"class":171},"    company",[161,2583,574],{"class":181},[161,2585,577],{"class":543},[161,2587,580],{"class":181},[161,2589,583],{"class":181},[161,2591,2592,2595,2597,2599,2601],{"class":163,"line":227},[161,2593,2594],{"class":171},"    contact",[161,2596,574],{"class":181},[161,2598,577],{"class":543},[161,2600,580],{"class":181},[161,2602,583],{"class":181},[161,2604,2605],{"class":163,"line":375},[161,2606,197],{"emptyLinePlaceholder":196},[161,2608,2609],{"class":163,"line":380},[161,2610,2611],{"class":306},"# Same collection — both types share inventory_objects\n",[161,2613,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2635,2637,2639,2641,2643,2645,2647,2649],{"class":163,"line":386},[161,2615,686],{"class":171},[161,2617,689],{"class":181},[161,2619,692],{"class":209},[161,2621,212],{"class":181},[161,2623,563],{"class":209},[161,2625,212],{"class":181},[161,2627,646],{"class":645},[161,2629,206],{"class":181},[161,2631,215],{"class":181},[161,2633,2634],{"class":218},"Keyboard",[161,2636,215],{"class":181},[161,2638,182],{"class":181},[161,2640,660],{"class":645},[161,2642,206],{"class":181},[161,2644,215],{"class":181},[161,2646,667],{"class":218},[161,2648,215],{"class":181},[161,2650,2651],{"class":181},"))\n",[161,2653,2654,2656,2658,2660,2662,2664,2666,2669,2671,2673,2676,2678,2680,2683,2685,2687,2690,2692],{"class":163,"line":409},[161,2655,686],{"class":171},[161,2657,689],{"class":181},[161,2659,692],{"class":209},[161,2661,212],{"class":181},[161,2663,2574],{"class":209},[161,2665,212],{"class":181},[161,2667,2668],{"class":645},"company",[161,2670,206],{"class":181},[161,2672,215],{"class":181},[161,2674,2675],{"class":218},"Acme",[161,2677,215],{"class":181},[161,2679,182],{"class":181},[161,2681,2682],{"class":645}," contact",[161,2684,206],{"class":181},[161,2686,215],{"class":181},[161,2688,2689],{"class":218},"john@acme.com",[161,2691,215],{"class":181},[161,2693,2651],{"class":181},[161,2695,2696],{"class":163,"line":432},[161,2697,197],{"emptyLinePlaceholder":196},[161,2699,2700],{"class":163,"line":702},[161,2701,2702],{"class":306},"# Read back by specifying the model class\n",[161,2704,2705,2708,2710,2712,2714,2716,2718,2720,2722,2724],{"class":163,"line":707},[161,2706,2707],{"class":171},"product ",[161,2709,206],{"class":181},[161,2711,1033],{"class":171},[161,2713,689],{"class":181},[161,2715,1038],{"class":209},[161,2717,212],{"class":181},[161,2719,1043],{"class":611},[161,2721,182],{"class":181},[161,2723,544],{"class":209},[161,2725,224],{"class":181},[161,2727,2728,2731,2733,2735,2737,2739,2741,2743,2745,2747],{"class":163,"line":733},[161,2729,2730],{"class":171},"supplier ",[161,2732,206],{"class":181},[161,2734,1033],{"class":171},[161,2736,689],{"class":181},[161,2738,1038],{"class":209},[161,2740,212],{"class":181},[161,2742,2196],{"class":611},[161,2744,182],{"class":181},[161,2746,2557],{"class":209},[161,2748,224],{"class":181},[161,2750,2751],{"class":163,"line":1417},[161,2752,197],{"emptyLinePlaceholder":196},[161,2754,2756],{"class":163,"line":2755},14,[161,2757,2758],{"class":306},"# Query only products — __centauro_name__ filter is automatic\n",[161,2760,2762,2764,2766,2768,2770,2772,2774,2776],{"class":163,"line":2761},15,[161,2763,1284],{"class":171},[161,2765,206],{"class":181},[161,2767,1033],{"class":171},[161,2769,689],{"class":181},[161,2771,1293],{"class":209},[161,2773,212],{"class":181},[161,2775,563],{"class":209},[161,2777,224],{"class":181},[1967,2779,2780,2781,2784,2785,2787],{"icon":14},"All models in a collection share the same underlying ",[128,2782,2783],{},"_objects"," table. The ",[128,2786,291],{}," filter is applied automatically whenever you query by model class.",[147,2789,141],{"id":2790},"timeseriescollection",[112,2792,2793,2794,2796,2797,2799,2800,487,2802,2805,2806,2809],{},"Use ",[128,2795,141],{}," when your models carry time-series data (",[128,2798,145],{},"). It creates both ",[128,2801,2783],{},[128,2803,2804],{},"_values"," tables, and adds ",[128,2807,2808],{},"values_mode"," control on updates.",[152,2811,2813],{"className":154,"code":2812,"language":156,"meta":157,"style":157},"from centaurodb import TimeSeriesCollection, CentauroModelSeries\n\nclass WeatherStation(CentauroModelSeries):\n    __centauro_name__ = \"WeatherStation\"\n    city: str = \"\"\n\nstations = TimeSeriesCollection(engine, \"stations\")\n",[128,2814,2815,2831,2835,2848,2861,2874,2878],{"__ignoreMap":157},[161,2816,2817,2819,2821,2823,2826,2828],{"class":163,"line":164},[161,2818,168],{"class":167},[161,2820,172],{"class":171},[161,2822,175],{"class":167},[161,2824,2825],{"class":171}," TimeSeriesCollection",[161,2827,182],{"class":181},[161,2829,2830],{"class":171}," CentauroModelSeries\n",[161,2832,2833],{"class":163,"line":193},[161,2834,197],{"emptyLinePlaceholder":196},[161,2836,2837,2839,2842,2844,2846],{"class":163,"line":200},[161,2838,540],{"class":539},[161,2840,2841],{"class":543}," WeatherStation",[161,2843,212],{"class":181},[161,2845,145],{"class":543},[161,2847,551],{"class":181},[161,2849,2850,2852,2854,2856,2859],{"class":163,"line":227},[161,2851,556],{"class":171},[161,2853,206],{"class":181},[161,2855,244],{"class":181},[161,2857,2858],{"class":218},"WeatherStation",[161,2860,566],{"class":181},[161,2862,2863,2866,2868,2870,2872],{"class":163,"line":375},[161,2864,2865],{"class":171},"    city",[161,2867,574],{"class":181},[161,2869,577],{"class":543},[161,2871,580],{"class":181},[161,2873,583],{"class":181},[161,2875,2876],{"class":163,"line":380},[161,2877,197],{"emptyLinePlaceholder":196},[161,2879,2880,2883,2885,2887,2889,2891,2893,2895,2898,2900],{"class":163,"line":386},[161,2881,2882],{"class":171},"stations ",[161,2884,206],{"class":181},[161,2886,2825],{"class":209},[161,2888,212],{"class":181},[161,2890,239],{"class":209},[161,2892,182],{"class":181},[161,2894,244],{"class":181},[161,2896,2897],{"class":218},"stations",[161,2899,215],{"class":181},[161,2901,224],{"class":181},[112,2903,2904,2906,2907,487,2910,689],{},[128,2905,141],{}," shares the same core API — write, read, query, update, views, indexes, relations — with additional time-series features like ",[128,2908,2909],{},"hydrate_values",[128,2911,2808],{},[1967,2913,2915,2916,2919,2920,689],{"icon":2914},"i-lucide-arrow-right","See the ",[468,2917,2918],{"href":65},"Time-Series guide"," for writing values, Polars integration, update modes, and multi-series patterns. For the full API, see ",[468,2921,2923],{"href":2922},"/api/collection#timeseriescollection","TimeSeriesCollection API",[2925,2926,2927],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":157,"searchDepth":193,"depth":193,"links":2929},[2930,2931,2934,2938,2951,2952,2953,2954,2955],{"id":149,"depth":193,"text":150},{"id":268,"depth":193,"text":269,"children":2932},[2933],{"id":456,"depth":200,"text":457},{"id":525,"depth":193,"text":526,"children":2935},[2936,2937],{"id":775,"depth":200,"text":776},{"id":927,"depth":200,"text":928},{"id":1010,"depth":193,"text":1011,"children":2939},[2940,2941,2942,2943,2945,2947,2948,2950],{"id":1014,"depth":200,"text":1015},{"id":1151,"depth":200,"text":1152},{"id":1261,"depth":200,"text":1262},{"id":1422,"depth":200,"text":2944},"Pattern matching with like",{"id":1547,"depth":200,"text":2946},"Matching a set of values with is_in",{"id":1621,"depth":200,"text":1622},{"id":1794,"depth":200,"text":2949},"Aggregates: max_field / min_field",{"id":1990,"depth":200,"text":1991},{"id":2249,"depth":193,"text":2250},{"id":2341,"depth":193,"text":2342},{"id":2494,"depth":193,"text":2495},{"id":2538,"depth":193,"text":2539},{"id":2790,"depth":193,"text":141},"Store, read, update, and query your models with Collection and TimeSeriesCollection.","md",null,{},{"icon":41},{"title":38,"description":2956},"YP3r14v1F5r15f3CteFZ8N9evGnV45x5UZZysbFk2fU",[2964,2966],{"title":33,"path":34,"stem":35,"description":2965,"icon":36,"children":-1},"Define your data with CentauroModel and CentauroModelSeries — the foundation of CentauroDB.",{"title":43,"path":44,"stem":45,"description":2967,"icon":46,"children":-1},"Turn JSON blobs into queryable SQL columns with auto-generated views and indexes.",1781105061964]