{"id":14069055,"url":"https://github.com/ropensci/nodbi","last_synced_at":"2026-03-09T11:34:59.921Z","repository":{"id":29418074,"uuid":"32953695","full_name":"ropensci/nodbi","owner":"ropensci","description":"Document DBI connector for R","archived":false,"fork":false,"pushed_at":"2024-11-10T17:23:53.000Z","size":3095,"stargazers_count":78,"open_issues_count":0,"forks_count":6,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-11-15T12:26:32.294Z","etag":null,"topics":["couchdb","database","elasticsearch","mongodb","nosql","postgresql","r","r-package","rstats","sqlite"],"latest_commit_sha":null,"homepage":"https://docs.ropensci.org/nodbi","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ropensci.png","metadata":{"files":{"readme":"README.Rmd","changelog":"NEWS.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":"codemeta.json"}},"created_at":"2015-03-26T21:48:45.000Z","updated_at":"2024-11-10T17:23:07.000Z","dependencies_parsed_at":"2023-09-22T04:41:23.565Z","dependency_job_id":"2ff62f31-0fe9-4b1c-9545-5b3ba65abc41","html_url":"https://github.com/ropensci/nodbi","commit_stats":{"total_commits":470,"total_committers":7,"mean_commits":67.14285714285714,"dds":0.3893617021276595,"last_synced_commit":"256188b95548ece5e29ff41cf363e70954d0e11e"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci%2Fnodbi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci%2Fnodbi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci%2Fnodbi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ropensci%2Fnodbi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ropensci","download_url":"https://codeload.github.com/ropensci/nodbi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228092121,"owners_count":17868139,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["couchdb","database","elasticsearch","mongodb","nosql","postgresql","r","r-package","rstats","sqlite"],"created_at":"2024-08-13T07:06:34.486Z","updated_at":"2025-10-22T06:11:45.398Z","avatar_url":"https://github.com/ropensci.png","language":"R","funding_links":[],"categories":["R"],"sub_categories":[],"readme":"---\noutput: github_document\neditor_options: \n chunk_output_type: console\n---\n\n# nodbi\n\n```{r echo=FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  eval = FALSE,\n  comment = \"#\",\n  out.width = \"100%\"\n)\n```\n\n⁠\u003c!-- badges: start --\u003e\n[![R-CMD-check](https://github.com/ropensci/nodbi/workflows/R-CMD-check/badge.svg)](https://github.com/ropensci/nodbi/actions?query=workflow%3AR-CMD-check)\n[![codecov](https://codecov.io/gh/rfhb/nodbi/branch/master/graph/badge.svg)](https://app.codecov.io/gh/rfhb/nodbi)\n[![CRAN status](https://www.r-pkg.org/badges/version/nodbi)](https://CRAN.R-project.org/package=nodbi)\n[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable)\n⁠\u003c!-- badges: end --\u003e\n\n`nodbi` is an R package that provides a single interface for several NoSQL databases and databases with JSON functionality, with the same function parameters and return values across all database backends. Last updated 2025-07-12.\n\n| Currently, `nodbi` supports\u003cbr/\u003eas database backends | for an `R` object of any\u003cbr/\u003eof these data types | for these operations |\n| :--------------------- | :--------------------- | :--------------------- |\n| MongoDB | data.frame | List, Exists |\n| SQLite | list | Create |\n| PostgreSQL | JSON string | Get |\n| DuckDB | file name of NDJSON records | Query |\n| Elasticsearch | URL of NDJSON records | Update |\n| CouchDB | | Delete |\n\nFor speed comparisons of database backends, see [benchmark](#benchmark) and [testing](#testing) below.\n\n## API overview\n\nParameters for `docdb_*()` functions are the same across all database backends. See [walk-through](#walk-through) below and the canonical testing in [core-nodbi.R](./tests/testthat/core-nodbi.R). \"Container\" is used as term to indicate where conceptually the backend holds the data, see [Database connections](#database-connections) below. The `key` parameter holds the name of a container. \n\n| Purpose | Function call |\n| :------------------------------ | :------------------------------------ |\n| Create database connection (see below) | `src \u003c- nodbi::src_{duckdb, postgres, mongo, sqlite, couchdb, elastic}(\u003csee below for parameters\u003e)` |\n| Load `my_data` (a data frame, list, JSON string, or file name or URL pointing to NDJSON records) into database, container `my_container` | `nodbi::docdb_create(src = src, key = \"my_container\", value = my_data)` |\n| Get all documents back into a data frame | `nodbi::docdb_get(src = src, key = \"my_container\")` |\n| Get documents selected with query (as MongoDB-compatible JSON) into a data frame | `nodbi::docdb_query(src = src, key = \"my_container\", query = '{\"age\": 20}')` |\n| Get selected fields (in MongoDB compatible JSON) from documents selected by query into a data frame | `nodbi::docdb_query(src = src, key = \"my_container\", query = '{\"age\": {\"$gt\": 20}}', fields = '{\"friends.name\": 1, \"_id\": 0, \"age\": 1}', limit = 2L)` |\n| Update (patch) documents selected by query with new data `my_data` (in a data frame, list, JSON string, or file name or URL pointing to NDJSON records) | `nodbi::docdb_update(src = src, key = \"my_container\", value = my_data, query = '{\"age\": 20}')` |\n| Check if container exists | `nodbi::docdb_exists(src = src, key = \"my_container\")` |\n| List all containers in database | `nodbi::docdb_list(src = src)` |\n| Delete document(s) in container | `nodbi::docdb_delete(src = src, key = \"my_container\", query = '{\"age\": 20}')` |\n| Delete container | `nodbi::docdb_delete(src = src, key = \"my_container\")` |\n| Close and remove database connection manually (when restarting R, connections are automatically closed and removed by `nodbi`) | `rm(src)` |\n\n## Install\n\nCRAN version\n\n```{r eval=FALSE}\ninstall.packages(\"nodbi\")\n```\n\nDevelopment version\n\n```{r eval=FALSE}\nremotes::install_github(\"ropensci/nodbi\")\n```\n\nLoad package from library\n\n```{r}\nlibrary(\"nodbi\")\n```\n\n## Database connections {#database-connections}\n\nOverview on parameters and aspects that are specific to the database backend. These are only needed once, for for `src_*()` to create a connection object. Any such connection object is subsequently used similarly across the `docdb_*` functions. \n\n\"Container\" refers to how conceptually the backend holds the data. Data types are mapped from JSON to R objects by [jsonlite](https://CRAN.R-project.org/package=jsonlite). Any root-level `_id` is extracted from the document(s) and used for an index column `_id`, otherwise a UUID is created as `_id`. \n\n### DuckDB\n\nSee also \u003chttps://CRAN.R-project.org/package=duckdb\u003e. \"Container\" refers to a DuckDB table, with columns `_id` and `json` created and used by package `nodbi`, applying SQL functions and functions as per \u003chttps://duckdb.org/docs/extensions/json\u003e to the `json` column. Each row in the table represents a `JSON` document. \n\n```{r}\nsrc \u003c- nodbi::src_duckdb(dbdir = \":memory:\", ...)\n```\n\n### MongoDB\n\n\"Container\" refers to a MongoDB collection, in which `nodbi` creates JSON documents. See also \u003chttps://jeroen.github.io/mongolite/\u003e. MongoDB but none of the other databases require to specify the container name already in the `src_*()` function; use the `collection` name for parameter `key` in `docdb_*` functions. \n\n```{r}\nsrc \u003c- nodbi::src_mongo(\n  collection = \"my_container\", db = \"my_database\",\n  url = \"mongodb://localhost\", ...\n)\n```\n\n### SQLite\n\n\"Container\" refers to an SQLite table, with columns `_id` and `json` created and used by package `nodbi`, applying SQL functions and functions as per \u003chttps://www.sqlite.org/json1.html\u003e to the `json` column. Each row in the table represents a `JSON` document. The table is indexed on `_id`. See also \u003chttps://CRAN.R-project.org/package=RSQLite\u003e. \n\n```{r}\nsrc \u003c- nodbi::src_sqlite(dbname = \":memory:\", ...)\n```\n\n### CouchDB\n\n\"Container\" refers to a CouchDB database, in which `nodbi` creates JSON documents. See also \u003chttps://CRAN.R-project.org/package=sofa\u003e. With CouchDB, function `docdb_update()` uses [jqr](https://cran.r-project.org/package=jqr) to implement patching JSON, in analogy to functions available for the other databases. \n\n```{r}\nsrc \u003c- nodbi::src_couchdb(\n  host = \"127.0.0.1\", port = 5984L, path = NULL,\n  transport = \"http\", user = NULL, pwd = NULL, headers = NULL\n)\n```\n\n### Elasticsearch\n\n\"Container\" refers to an Elasticsearch index, in which `nodbi` creates JSON documents. Opensearch can equally be used. See also \u003chttps://CRAN.R-project.org/package=elastic\u003e. Only lowercase is accepted for container names (in parameter `key` of `docdb_*` functions). \n\n```{r}\nsrc \u003c- nodbi::src_elastic(\n  host = \"127.0.0.1\", port = 9200L, path = NULL,\n  transport_schema = \"http\", user = NULL, pwd = NULL, ...\n)\n```\n\n### PostgreSQL\n\n\"Container\" refers to a PostgreSQL table, with columns `_id` and `json` created and used by package `nodbi`, applying SQL functions and functions as per \u003chttps://www.postgresql.org/docs/current/functions-json.html\u003e to the `json` column. With PostgreSQL, a custom `plpgsql` function [jsonb_merge_patch()](https://github.com/ropensci/nodbi/blob/master/R/src_postgres.R#L60) is used for `docdb_update()`. The order of variables in data frames returned by `docdb_get()` and `docdb_query()` can differ from their order the input to `docdb_create()`. \n\n```{r}\nsrc \u003c- nodbi::src_postgres(\n  dbname = \"my_database\", host = \"127.0.0.1\", port = 5432L, ...\n)\n```\n\n## Walk-through {#walk-through}\n\nThis example is to show how functional `nodbi` is at this time: With any of the six database backends, the functions work in the same way and return the same values. \n\n```{r}\n# load nodbi\nlibrary(nodbi)\n\n# name of container\nkey \u003c- \"my_container\"\n\n# connect any of these database backends\nsrc \u003c- src_duckdb()\nsrc \u003c- src_mongo(collection = key)\nsrc \u003c- src_sqlite()\nsrc \u003c- src_postgres()\nsrc \u003c- src_elastic()\nsrc \u003c- src_couchdb(\n  user = Sys.getenv(\"COUCHDB_TEST_USER\"),\n  pwd = Sys.getenv(\"COUCHDB_TEST_PWD\")\n)\n\n# check if container already exists\ndocdb_exists(src, key)\n# [1] FALSE\n\n# load data (here data frame, alternatively a list, JSON or file with NSJSON)\n# into the container \"my_container\" specified in \"key\" parameter\ndocdb_create(src, key, value = mtcars)\n# [1] 32\n\n# load additionally 98 NDJSON records\ndocdb_create(src, key, \"https://httpbin.org/stream/98\")\n# Note: container 'my_container' already exists\n# [1] 98\n\n# load additionally contacts JSON data, from package nodbi\ndocdb_create(src, key, contacts)\n# Note: container 'my_container' already exists\n# [1] 5\n\n# get all documents, irrespective of schema\ndplyr::tibble(docdb_get(src, key))\n# # A tibble: 135 × 27\n#    `_id` isActive balance   age eyeColor name  email about registered tags   friends\n#    \u003cchr\u003e \u003clgl\u003e    \u003cchr\u003e   \u003cint\u003e \u003cchr\u003e    \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e \u003cchr\u003e      \u003clist\u003e \u003clist\u003e\n#  1 5cd6… TRUE     $2,412…    20 blue     Kris… kris… \"Sin… 2017-07-1… \u003cchr\u003e  \u003cdf\u003e\n#  2 5cd6… FALSE    $3,400…    20 brown    Rae … raec… \"Nis… 2018-12-1… \u003cchr\u003e  \u003cdf\u003e\n#  3 5cd6… TRUE     $1,161…    22 brown    Pace… pace… \"Eiu… 2018-08-1… \u003cchr\u003e  \u003cdf\u003e\n#  4 5cd6… FALSE    $2,579…    30 brown    Will… will… \"Nul… 2018-02-1… \u003cchr\u003e  \u003cdf\u003e\n#  5 5cd6… FALSE    $3,808…    23 green    Lacy… lacy… \"Sun… 2014-08-0… \u003cchr\u003e  \u003cdf\u003e\n#  6 69bc… NA       NA         NA NA       NA    NA     NA   NA         \u003cNULL\u003e \u003cNULL\u003e\n#  7 69bc… NA       NA         NA NA       NA    NA     NA   NA         \u003cNULL\u003e \u003cNULL\u003e\n#  8 69bc… NA       NA         NA NA       NA    NA     NA   NA         \u003cNULL\u003e \u003cNULL\u003e\n#  9 69bc… NA       NA         NA NA       NA    NA     NA   NA         \u003cNULL\u003e \u003cNULL\u003e\n# 10 69bc… NA       NA         NA NA       NA    NA     NA   NA         \u003cNULL\u003e \u003cNULL\u003e\n# # ℹ 125 more rows\n# # ℹ 16 more variables: url \u003cchr\u003e, args \u003cdf[,0]\u003e, headers \u003cdf[,4]\u003e, origin \u003cchr\u003e,\n# #   id \u003cint\u003e, mpg \u003cdbl\u003e, cyl \u003cint\u003e, disp \u003cdbl\u003e, hp \u003cint\u003e, drat \u003cdbl\u003e, wt \u003cdbl\u003e,\n# #   qsec \u003cdbl\u003e, vs \u003cint\u003e, am \u003cint\u003e, gear \u003cint\u003e, carb \u003cint\u003e\n# # ℹ Use `print(n = ...)` to see more rows\n\n\n# query some documents\ndocdb_query(src, key, query = '{\"mpg\": {\"$gte\": 30}}')\n#              _id mpg cyl disp  hp drat  wt qsec vs am gear carb\n# 1       Fiat 128  32   4   79  66  4.1 2.2   19  1  1    4    1\n# 2    Honda Civic  30   4   76  52  4.9 1.6   19  1  1    4    2\n# 3 Toyota Corolla  34   4   71  65  4.2 1.8   20  1  1    4    1\n# 4   Lotus Europa  30   4   95 113  3.8 1.5   17  1  1    5    2\n\n# query some fields from some documents; 'query' is a mandatory\n# parameter and is used here in its position in the signature\ndocdb_query(src, key, '{\"mpg\": {\"$gte\": 30}}', fields = '{\"wt\": 1, \"mpg\": 1}')\n#              _id  wt mpg\n# 1       Fiat 128 2.2  32\n# 2    Honda Civic 1.6  30\n# 3   Lotus Europa 1.5  30\n# 4 Toyota Corolla 1.8  34\n\n# query some subitem fields from some documents\nstr(docdb_query(\n  src, key,\n  query = '{\"$or\": [{\"age\": {\"$gt\": 21}},\n           {\"friends.name\": {\"$regex\": \"^B[a-z]{3,9}.*\"}}]}',\n  fields = '{\"age\": 1, \"friends.name\": 1}'\n))\n# 'data.frame':\t3 obs. of  3 variables:\n#  $ _id         : chr  \"5cd6785325ce3a94dfc54096\" \"5cd6785335b63cb19dfa8347\" \"5cd67853f841025e65ce0ce2\"\n#  $ age         : int  22 30 23\n#  $ friends.name:List of 3\n#   ..$ : chr  \"Baird Keller\" \"Francesca Reese\" \"Dona Bartlett\"\n#   ..$ : chr  \"Coleen Dunn\" \"Doris Phillips\" \"Concetta Turner\"\n#   ..$ : chr  \"Wooten Goodwin\" \"Brandie Woodward\" \"Angelique Britt\"\n\n# such queries can also be used for updating (patching) selected documents\n# with a new 'value'(s) from a JSON string, a data frame a list or a file with NSJSON)\ndocdb_update(src, key, value = '{\"vs\": 9, \"xy\": [1, 2]}', query = '{\"carb\": 3}')\n# [1] 3\ndocdb_query(src, key, '{\"carb\": {\"$in\": [1,3]}}', fields = '{\"vs\": 1, \"_id\": 0}')[[1]]\n# [1] 1 1 1 9 9 9 1 1 1 1\ndocdb_get(src, key)[c(3, 109, 130, 101), c(\"_id\", \"xy\", \"url\", \"email\")]\n#                                      _id   xy                           url                  email\n# 3               5cd6785325ce3a94dfc54096 NULL                          \u003cNA\u003e pacebell@conjurica.com\n# 109                     Dodge Challenger NULL                          \u003cNA\u003e                   \u003cNA\u003e\n# 130                     Pontiac Firebird NULL                          \u003cNA\u003e                   \u003cNA\u003e\n# 101 69bcd195-a59c-11ee-bfb9-acbc328130bb NULL https://httpbin.org/stream/98                   \u003cNA\u003e\n\n# use with dplyr\n# *note* that dplyr includes a (deprecated) function src_sqlite\n# which would mask nodbi's src_sqlite, so it is excluded here\nlibrary(\"dplyr\", exclude = c(\"src_sqlite\", \"src_postgres\"))\n#\ndocdb_get(src, key) %\u003e%\n  group_by(gear) %\u003e%\n  summarise(mean_mpg = mean(mpg))\n# # A tibble: 4 × 2\n#    gear mean_mpg\n#   \u003cint\u003e    \u003cdbl\u003e\n# 1     3     16.1\n# 2     4     24.5\n# 3     5     21.4\n# 4    NA     NA\n\n# delete documents; query is optional parameter and has to be\n# specified for deleting documents instead of deleting the container\ndim(docdb_query(src, key, query = '{\"$or\": [{\"age\": {\"$lte\": 20}}, {\"age\": {\"$gte\": 25}}]}'))\n# [1] 3 11\ndocdb_delete(src, key, query = '{\"$or\": [{\"age\": {\"$lte\": 20}}, {\"age\": {\"$gte\": 25}}]}')\n# TRUE\nnrow(docdb_get(src, key))\n# [1] 132\n\n# delete container from database\ndocdb_delete(src, key)\n# [1] TRUE\n#\n# shutdown\nDBI::dbDisconnect(src$con, shutdown = TRUE)\nrm(src)\n```\n\n## Benchmark {#benchmark}\n\n```{r}\nlibrary(\"nodbi\")\n\nsrcMongo \u003c- src_mongo()\nsrcSqlite \u003c- src_sqlite()\nsrcPostgres \u003c- src_postgres()\nsrcDuckdb \u003c- src_duckdb()\nsrcElastic \u003c- src_elastic()\nsrcCouchdb \u003c- src_couchdb(\n  user = Sys.getenv(\"COUCHDB_TEST_USER\"),\n  pwd = Sys.getenv(\"COUCHDB_TEST_PWD\")\n)\n\nkey \u003c- \"test2\"\nquery \u003c- '{\"clarity\": {\"$in\": [\"NOTME\", \"VS1\"]}}'\nfields \u003c- '{\"cut\": 1, \"_id\": 1, \"clarity\": 1}'\nvalue \u003c- '{\"clarity\": \"XYZ\", \"new\": [\"ABC\", \"DEF\"]}'\ndata \u003c- diamonds[1:1000, ]\nndjs \u003c- tempfile()\njsonlite::stream_out(diamonds[1:10000, ], con = file(ndjs), verbose = FALSE)\n\ntestFunction \u003c- function(src, key, value, query, fields) {\n  try(docdb_delete(src, key), silent = TRUE)\n  on.exit(docdb_delete(src, key))\n  suppressMessages(docdb_create(src, key, data))\n  suppressMessages(docdb_create(src, key, ndjs))\n  head(docdb_get(src, key))\n  docdb_query(src, key, query = query, fields = fields)\n  docdb_query(src, key, query = query, listfields = TRUE)\n  docdb_update(src, key, value = value, query = query)\n}\n\nresult \u003c- rbenchmark::benchmark(\n  MongoDB = testFunction(src = srcMongo, key, value, query, fields),\n  SQLite = testFunction(src = srcSqlite, key, value, query, fields),\n  Elastic = testFunction(src = srcElastic, key, value, query, fields),\n  CouchDB = testFunction(src = srcCouchdb, key, value, query, fields),\n  PostgreSQL = testFunction(src = srcPostgres, key, value, query, fields),\n  DuckDB = testFunction(src = srcDuckdb, key, value, query, fields),\n  replications = 3L\n)\n\n# 2025-07-12 with M3 hardware, databases via homebrew\nresult[rev(order(result$elapsed)), c(\"test\", \"replications\", \"elapsed\")]\n#         test replications elapsed\n# 4    CouchDB            3   48.93\n# 3    Elastic            3   25.00\n# 1    MongoDB            3    2.11\n# 5 PostgreSQL            3    1.51\n# 6     DuckDB            3    0.92\n# 2     SQLite            3    0.65\n\nmessage(R.version$version.string)\n# R version 4.5.1 RC (2025-06-05 r88281)\n\npkgs \u003c- c(\"nodbi\", \"RSQLite\", \"duckdb\", \"RPostgres\", \"mongolite\", \"elastic\", \"sofa\")\nfor (pkg in pkgs) message(pkg, \": \", packageVersion(pkg))\n# nodbi: 0.13.1\n# RSQLite: 2.4.1\n# duckdb: 1.3.2\n# RPostgres: 1.4.8\n# mongolite: 4.0.0\n# elastic: 1.2.0\n# sofa: 0.4.0\n```\n\n## Testing {#testing}\n\nEvery database backend is subjected to identical tests, see [core-nodbi.R](https://github.com/ropensci/nodbi/blob/master/tests/testthat/core-nodbi.R). \n\n```{r testing_and_coverage}\n# 2025-07-12\n\nsuppressMessages(testthat::test_local())\n# ✔ | F W  S  OK | Context\n# ✔ |      2 175 | couchdb [46.0s]\n# ✔ |      1 174 | duckdb [3.8s]\n# ✔ |      2 173 | elastic [37.9s]\n# ✔ |      2 173 | mongodb [3.9s]\n# ✔ |        176 | postgres [4.8s]\n# ✔ |        177 | sqlite [3.7s]\n# ══ Results ═══════════════════════════════\n# Duration: 100.2 s\n# ── Skipped tests (7) ─────────────────────\n# • Testing for auto disconnect and shutdown not relevant (3): \n#   test-couchdb.R:26:3, test-elastic.R:21:3,\n#   test-mongodb.R:24:3\n# • Testing for parallel writes not possible or implemented (4): \n#   test-couchdb.R:26:3, test-duckdb.R:22:3,\n#   test-elastic.R:21:3, test-mongodb.R:24:3\n# \n# [ FAIL 0 | WARN 0 | SKIP 7 | PASS 1048 ]\n\ncovr::package_coverage(path = \".\", type = \"tests\")\n# nodbi Coverage: 93.42%\n# R/src_postgres.R: 82.19%\n# R/src_duckdb.R: 84.00%\n# R/zzz.R: 86.67%\n# R/query.R: 92.92%\n# R/update.R: 94.40%\n# R/src_mongo.R: 95.00%\n# R/get.R: 95.79%\n# R/create.R: 96.25%\n# R/delete.R: 98.96%\n# R/exists.R: 100.00%\n# R/list.R: 100.00%\n# R/src_couchdb.R: 100.00%\n# R/src_elastic.R: 100.00%\n# R/src_sqlite.R: 100.00%\n```\n\n## Notes\n\n-   Please [report any issues or bugs](https://github.com/ropensci/nodbi/issues).\n-   License: MIT\n-   Get citation information for `nodbi` in R doing `citation(package = 'nodbi')`\n-   Please note that this package is released with a [Contributor Code of Conduct](https://ropensci.org/code-of-conduct/). By contributing to this project, you agree to abide by its terms.\n-   Support for redis has been removed since version 0.5.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci%2Fnodbi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fropensci%2Fnodbi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fropensci%2Fnodbi/lists"}