@eldoy/webdb 0.1.2 → 0.4.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.
- package/README.md +24 -6
- package/index.js +106 -24
- 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
|
+
// Put (create or update one)
|
|
43
|
+
var doc = await db('user').put(
|
|
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
|
|
95
|
-
$ne
|
|
96
|
-
$gt
|
|
97
|
-
$gte
|
|
98
|
-
$lt
|
|
99
|
-
$lte
|
|
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
|
+
put: 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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
109
|
+
// find one
|
|
110
|
+
var r = await dbi.find({
|
|
111
|
+
selector: query,
|
|
112
|
+
limit: 1
|
|
113
|
+
})
|
|
86
114
|
|
|
87
|
-
|
|
88
|
-
return r.docs
|
|
89
|
-
},
|
|
115
|
+
if (!r.docs.length) return null
|
|
90
116
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
//
|
|
117
|
+
var cur = r.docs[0]
|
|
118
|
+
var next = {}
|
|
94
119
|
|
|
95
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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
|
//
|