@eldoy/webdb 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +24 -6
  2. package/index.js +106 -24
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -28,6 +28,23 @@ var n = await db('user').update(
28
28
  { active: true }
29
29
  )
30
30
 
31
+ // Set (update exactly one)
32
+ var updated = await db('user').set(
33
+ { name: 'A' },
34
+ { name: 'B', active: true }
35
+ )
36
+
37
+ // Remove (delete exactly one)
38
+ var removed = await db('user').remove(
39
+ { name: 'B' }
40
+ )
41
+
42
+ // Upsert (create or update one)
43
+ var doc = await db('user').upsert(
44
+ { email: 'a@example.com' },
45
+ { email: 'a@example.com', name: 'Alice' }
46
+ )
47
+
31
48
  // Get one (first match)
32
49
  var doc = await db('user').get({ name: 'Heimdal' })
33
50
 
@@ -91,12 +108,13 @@ WebDB queries map directly to CouchDB Mango selectors. All Mango operators and o
91
108
  Mango supports standard comparison operators inside selectors:
92
109
 
93
110
  ```
94
- $eq equal
95
- $ne not equal
96
- $gt greater than
97
- $gte greater than or equal
98
- $lt less than
99
- $lte less than or equal
111
+ $eq equal
112
+ $ne not equal
113
+ $gt greater than
114
+ $gte greater than or equal
115
+ $lt less than
116
+ $lte less than or equal
117
+ $regex regular expression matching
100
118
  ```
101
119
 
102
120
  Example:
package/index.js CHANGED
@@ -46,6 +46,39 @@ function api(name, server) {
46
46
  return docs.length
47
47
  },
48
48
 
49
+ upsert: async function (query, update) {
50
+ var dbi = await ensure(name, server)
51
+
52
+ // find one match
53
+ var r = await dbi.find({
54
+ selector: query,
55
+ limit: 1
56
+ })
57
+
58
+ // create if not found
59
+ if (!r.docs.length) {
60
+ var created = await dbi.insert(update)
61
+ return {
62
+ _id: created.id,
63
+ _rev: created.rev,
64
+ ...update
65
+ }
66
+ }
67
+
68
+ // update existing
69
+ var cur = r.docs[0]
70
+ var next = {}
71
+
72
+ for (var k in cur) next[k] = cur[k]
73
+ for (var k in update) next[k] = update[k]
74
+
75
+ var res = await dbi.insert(next)
76
+
77
+ next._id = res.id
78
+ next._rev = res.rev
79
+ return next
80
+ },
81
+
49
82
  update: async function (query, update) {
50
83
  var db = await ensure(name, server)
51
84
  var r = await db.find({ selector: query })
@@ -70,39 +103,59 @@ function api(name, server) {
70
103
  return r.docs[0] || null
71
104
  },
72
105
 
73
- //
74
- // FIND
75
- //
76
-
77
- find: async function (selector, opts) {
106
+ set: async function (query, update) {
78
107
  var dbi = await ensure(name, server)
79
108
 
80
- var q = { selector: selector }
81
- if (opts) {
82
- if (opts.sort) q.sort = opts.sort
83
- if (opts.limit) q.limit = opts.limit
84
- if (opts.fields) q.fields = opts.fields
85
- }
109
+ // find one
110
+ var r = await dbi.find({
111
+ selector: query,
112
+ limit: 1
113
+ })
86
114
 
87
- var r = await dbi.find(q)
88
- return r.docs
89
- },
115
+ if (!r.docs.length) return null
90
116
 
91
- //
92
- // INDEX
93
- //
117
+ var cur = r.docs[0]
118
+ var next = {}
94
119
 
95
- index: async function (list) {
120
+ // merge current doc + update
121
+ for (var k in cur) next[k] = cur[k]
122
+ for (var k in update) next[k] = update[k]
123
+
124
+ // write updated doc
125
+ var res = await dbi.insert(next)
126
+
127
+ // return updated document shape
128
+ next._id = res.id
129
+ next._rev = res.rev
130
+ return next
131
+ },
132
+
133
+ remove: async function (query) {
96
134
  var dbi = await ensure(name, server)
97
- for (var i = 0; i < list.length; i++) {
98
- await dbi.createIndex({ index: { fields: list[i] } })
135
+
136
+ // find one
137
+ var r = await dbi.find({
138
+ selector: query,
139
+ limit: 1
140
+ })
141
+
142
+ if (!r.docs.length) return null
143
+
144
+ var doc = r.docs[0]
145
+
146
+ // mark as deleted
147
+ var res = await dbi.insert({
148
+ _id: doc._id,
149
+ _rev: doc._rev,
150
+ _deleted: true
151
+ })
152
+
153
+ return {
154
+ _id: res.id,
155
+ _rev: res.rev
99
156
  }
100
157
  },
101
158
 
102
- //
103
- // DELETE
104
- //
105
-
106
159
  delete: async function (query) {
107
160
  var dbi = await ensure(name, server)
108
161
 
@@ -123,6 +176,35 @@ function api(name, server) {
123
176
  return out.length
124
177
  },
125
178
 
179
+ //
180
+ // FIND
181
+ //
182
+
183
+ find: async function (query, opts) {
184
+ var dbi = await ensure(name, server)
185
+
186
+ var q = { selector: query }
187
+ if (opts) {
188
+ if (opts.sort) q.sort = opts.sort
189
+ if (opts.limit) q.limit = opts.limit
190
+ if (opts.fields) q.fields = opts.fields
191
+ }
192
+
193
+ var r = await dbi.find(q)
194
+ return r.docs
195
+ },
196
+
197
+ //
198
+ // INDEX
199
+ //
200
+
201
+ index: async function (list) {
202
+ var dbi = await ensure(name, server)
203
+ for (var i = 0; i < list.length; i++) {
204
+ await dbi.createIndex({ index: { fields: list[i] } })
205
+ }
206
+ },
207
+
126
208
  //
127
209
  // COUNT
128
210
  //
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eldoy/webdb",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "description": "Document database client powered by CouchDB.",
5
5
  "publishConfig": {
6
6
  "access": "public"