most-couchdb
Version:
most (data streaming) for CouchDB
95 lines (72 loc) • 2.43 kB
Markdown
merge_map = (doc) -> Object.assign {}, doc
update_map = (doc) -> {_rev:doc._rev}
id_of = ({_id}) -> _id
class CouchDBWithUpdate extends require './db'
constructor: (args...) ->
super args...
=
new: `0n`
changed: `0n`
unchanged: `0n`
Single-record merge / update
----------------------------
__merge: (doc,data,map) ->
if doc?._rev?
new_doc = Object.assign (map doc), data
if not isDeepStrictEqual new_doc, doc
.changed++
new_doc
else
.unchanged++
null
else
.new++
data
__update: (id,data,map) ->
doc = await .catch -> {}
new_doc = doc,data,map
if new_doc?
await new_doc
return
`merge`: update the fields indicated by `data` in an existing document indicated by `id`
The update is only processed if the document would change.
merge: (id,data) ->
id, data, merge_map
`update`: replace a document with new content
The update is only processed if the document would change.
update: (data) ->
(id_of data), data, update_map
Bulk update
-----------
bulk_get: (docs) -> # docs is an Array of {id,rev}
uri = new URL '_bulk_get', +'/'
{body} = await
.post uri.toString()
.send {docs}
.accept 'json'
{results} = body
docs = results.map ({docs}) -> docs[0].ok ? null
bulk_docs: (docs) -> # docs is an Array of documents
uri = new URL '_bulk_docs', +'/'
{body} = await
.post uri.toString()
.send {docs}
.accept 'json'
body
__bulk_update: (ids,new_docs,map) ->
docs = await ids.map (id) -> {id}
new_docs = docs.map (doc,i) =>
data = new_docs[i]
doc,data,map
changed = new_docs.filter (doc) -> doc?
if changed.length > 0
results = await changed
else
results = []
results
bulk_merge: (ids,changes) ->
ids, changes, merge_map
bulk_update: (docs) ->
(docs.map id_of), docs, update_map
module.exports = CouchDBWithUpdate
{isDeepStrictEqual} = require 'util'