{"id":7992,"date":"2015-11-05T12:15:46","date_gmt":"2015-11-05T10:15:46","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=7992"},"modified":"2015-10-26T18:07:51","modified_gmt":"2015-10-26T16:07:51","slug":"testing-pymongo-black-pipe","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/","title":{"rendered":"Testing PyMongo As A Black Pipe"},"content":{"rendered":"<p>This is the second article in <a href=\"http:\/\/emptysqua.re\/blog\/black-pipe-testing-series\/\">my six-part series on &#8220;black pipe&#8221; testing<\/a>. PyMongo, the official Python client for MongoDB, is a great example of a connected application that can&#8217;t be fully tested as a black box.<\/p>\n<p>It has <em>two<\/em> ends that take inputs and provide outputs: one is its public API, the methods <code>find<\/code> and <code>insert_one<\/code> and so on. But the other is its communication over the network with the MongoDB server. Only by treating it as a black pipe can we fully test its surfaces.<\/p>\n<p>This year I implemented a tool for black pipe testing called <a href=\"http:\/\/mockupdb.readthedocs.org\/\">MockupDB<\/a>. It is a <a href=\"http:\/\/docs.mongodb.org\/meta-driver\/latest\/legacy\/mongodb-wire-protocol\/\">MongoDB wire protocol<\/a> server written in Python, with three sets of features to aid tests:<\/p>\n<ul>\n<li>First, it speaks the whole wire protocol, over TCP, just like a MongoDB server. You can even connect to it with the mongo shell.<\/li>\n<li>Second, it can run in the same Python process as PyMongo. A black pipe test neatly interleaves PyMongo calls and MockupDB calls to choreograph a sequence of requests and responses.<\/li>\n<li>Third, MockupDB has a rich API for validating the messages PyMongo sends.<\/li>\n<\/ul>\n<h2>Testing PyMongo With MockupDB<\/h2>\n<p>Here&#8217;s the sort of test for which &#8220;black box&#8221; fails, but &#8220;black pipe&#8221; is perfect.<\/p>\n<p>Starting with version 2.6 last year, MongoDB&#8217;s wire protocol for modifying data changed. To insert a document, for example, drivers no longer send an OP_INSERT message followed by a &#8220;getLastError&#8221; command. Instead, drivers send a single command, called &#8220;insert&#8221;. A driver should use the new protocol if the server is modern enough to understand it.<\/p>\n<p><em>But<\/em>, it is impossible to know, based on its externally-observable behavior, whether a driver is using the old or new protocol. MongoDB supports the old wire protocol to this day. Even if a driver never upgrades its protocol, it can still insert data. So a black box test would pass! How do we validate that a driver uses the new protocol?<\/p>\n<p>First, we start a MockupDB server that speaks the new wire protocol:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; from mockupdb import MockupDB\r\n&gt;&gt;&gt; server = MockupDB(auto_ismaster={\"maxWireVersion\": 3})\r\n&gt;&gt;&gt; server.run()\r\n&gt;&gt;&gt; \r\n&gt;&gt;&gt; from pymongo import MongoClient\r\n&gt;&gt;&gt; client = MongoClient(server.uri)\r\n&gt;&gt;&gt; collection = client.db.collection<\/pre>\n<p>Let us insert a document. Once the client sends its message to MockupDB, it blocks awaiting acknowledgment, so we run it on a background thread using MockupDB&#8217;s <code>go<\/code> function:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; from mockupdb import go\r\n&gt;&gt;&gt; document = {\"_id\": 1}\r\n&gt;&gt;&gt; future = go(collection.insert_one, document)<\/pre>\n<p>Now the client waits, and we use MockupDB to read the message it sent:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; request = server.receives()\r\n&gt;&gt;&gt; request\r\nCommand({\"insert\": \"collection\", \"documents\": [{\"_id\": 1}]})<\/pre>\n<p>We see the client has correctly sent an &#8220;insert&#8221; command, part of the new wire protocol. Respond on the main thread:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; request.reply({'ok': 1})<\/pre>\n<p>This unblocks the client, so the result of <code>go(collection.insert_one, document)<\/code> is ready:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; future()\r\n&lt;pymongo.results.InsertOneResult&gt;<\/pre>\n<p>Let us say the driver had a bug, and it did <em>not<\/em> speak the new wire protocol when talking to a modern server. A black box test could not detect this bug, but MockupDB can. We validate that the client sends the right message using MockupDB&#8217;s pattern-matching:<\/p>\n<pre class=\" brush:php\">&gt;&gt;&gt; # How a test would fail if PyMongo did\r\n&gt;&gt;&gt; # not correctly use the new protocol:\r\n&gt;&gt;&gt;\r\n&gt;&gt;&gt; from mockupdb import Command\r\n&gt;&gt;&gt; request = server.receives(Command({\"insert\": \"collection\"}))\r\nAssertionError:\r\nexpected Command({\"insert\": \"collection\"}), got OpInsert({\"_id\": 1})<\/pre>\n<p>With MockupDB we catch the bug, because we test both ends of the pipe.<\/p>\n<p>A variety of MongoDB driver tests were difficult or impossible, until now. I&#8217;m excited to begin testing driver features that were only manually tested before, using tcpdump or the like. I look forward even more to deleting hacky old tests that access PyMongo internals or exploit odd MongoDB server behaviors. Most such tests can now be gracefully expressed as black pipe tests with MockupDB.<\/p>\n<p><strong><a href=\"http:\/\/emptysqua.re\/blog\/black-pipe-testing-series\/\">Read the whole series on black pipe testing.<\/a><\/strong><\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/emptysqua.re\/blog\/black-pipe-testing-pymongo\/\">Testing PyMongo As A Black Pipe<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Jesse Davis at the <a href=\"http:\/\/emptysqua.re\/blog\/\">A. Jesse Jiryu Davis<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>This is the second article in my six-part series on &#8220;black pipe&#8221; testing. PyMongo, the official Python client for MongoDB, is a great example of a connected application that can&#8217;t be fully tested as a black box. It has two ends that take inputs and provide outputs: one is its public API, the methods find &hellip;<\/p>\n","protected":false},"author":29,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[57],"class_list":["post-7992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-mongodb"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Testing PyMongo As A Black Pipe - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"This is the second article in my six-part series on &quot;black pipe&quot; testing. PyMongo, the official Python client for MongoDB, is a great example of a\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testing PyMongo As A Black Pipe - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"This is the second article in my six-part series on &quot;black pipe&quot; testing. PyMongo, the official Python client for MongoDB, is a great example of a\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2015-11-05T10:15:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jesse Davis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/jessejiryudavis\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jesse Davis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\"},\"author\":{\"name\":\"Jesse Davis\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/294d6819cb410ef55f273ecf25426c56\"},\"headline\":\"Testing PyMongo As A Black Pipe\",\"datePublished\":\"2015-11-05T10:15:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\"},\"wordCount\":566,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"keywords\":[\"MongoDB\"],\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\",\"name\":\"Testing PyMongo As A Black Pipe - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2015-11-05T10:15:46+00:00\",\"description\":\"This is the second article in my six-part series on \\\"black pipe\\\" testing. PyMongo, the official Python client for MongoDB, is a great example of a\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Testing PyMongo As A Black Pipe\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/294d6819cb410ef55f273ecf25426c56\",\"name\":\"Jesse Davis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2db0fdaadd8cd6b86d93e1205e30dd3b43e3c46b91826513ab618934c3db8cf9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2db0fdaadd8cd6b86d93e1205e30dd3b43e3c46b91826513ab618934c3db8cf9?s=96&d=mm&r=g\",\"caption\":\"Jesse Davis\"},\"description\":\"Jesse is a senior engineer at MongoDB in New York City. He specializes in Python, MongoDB drivers, and asynchronous frameworks.\",\"sameAs\":[\"http:\/\/emptysqua.re\/blog\/\",\"https:\/\/x.com\/https:\/\/twitter.com\/jessejiryudavis\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jesse-davis\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Testing PyMongo As A Black Pipe - Web Code Geeks - 2026","description":"This is the second article in my six-part series on \"black pipe\" testing. PyMongo, the official Python client for MongoDB, is a great example of a","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/","og_locale":"en_US","og_type":"article","og_title":"Testing PyMongo As A Black Pipe - Web Code Geeks - 2026","og_description":"This is the second article in my six-part series on \"black pipe\" testing. PyMongo, the official Python client for MongoDB, is a great example of a","og_url":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2015-11-05T10:15:46+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Jesse Davis","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/jessejiryudavis","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jesse Davis","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/"},"author":{"name":"Jesse Davis","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/294d6819cb410ef55f273ecf25426c56"},"headline":"Testing PyMongo As A Black Pipe","datePublished":"2015-11-05T10:15:46+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/"},"wordCount":566,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","keywords":["MongoDB"],"articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/","url":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/","name":"Testing PyMongo As A Black Pipe - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2015-11-05T10:15:46+00:00","description":"This is the second article in my six-part series on \"black pipe\" testing. PyMongo, the official Python client for MongoDB, is a great example of a","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/python\/testing-pymongo-black-pipe\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"Testing PyMongo As A Black Pipe"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/294d6819cb410ef55f273ecf25426c56","name":"Jesse Davis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2db0fdaadd8cd6b86d93e1205e30dd3b43e3c46b91826513ab618934c3db8cf9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2db0fdaadd8cd6b86d93e1205e30dd3b43e3c46b91826513ab618934c3db8cf9?s=96&d=mm&r=g","caption":"Jesse Davis"},"description":"Jesse is a senior engineer at MongoDB in New York City. He specializes in Python, MongoDB drivers, and asynchronous frameworks.","sameAs":["http:\/\/emptysqua.re\/blog\/","https:\/\/x.com\/https:\/\/twitter.com\/jessejiryudavis"],"url":"https:\/\/www.webcodegeeks.com\/author\/jesse-davis\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/7992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=7992"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/7992\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=7992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=7992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=7992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}