mongous 0.1.6 → 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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +296 -46
  3. data/README.ja.adoc +297 -47
  4. data/lib/mongous/base.rb +35 -2
  5. data/lib/mongous/document.rb +75 -32
  6. data/lib/mongous/extention.rb +72 -57
  7. data/lib/mongous/filter.rb +273 -208
  8. data/lib/mongous/version.rb +1 -1
  9. data/mongous.gemspec +1 -1
  10. data/sample/connect_auto_0.rb +9 -0
  11. data/sample/connect_auto_2.rb +2 -1
  12. data/sample/connect_default_2.rb +2 -1
  13. data/sample/connect_environ_2.rb +2 -1
  14. data/sample/connect_loadfile_2.rb +2 -1
  15. data/sample/declare_compact_1.rb +7 -7
  16. data/sample/declare_label_1.rb +10 -6
  17. data/sample/declare_ndex_1.rb +9 -5
  18. data/sample/declare_ndex_2.rb +10 -6
  19. data/sample/declare_strict_1.rb +14 -10
  20. data/sample/declare_strict_2.rb +5 -3
  21. data/sample/{multi_docs_1.rb → multi_collection_1.rb} +0 -0
  22. data/sample/multi_collection_2.rb +63 -0
  23. data/sample/multi_collection_3.rb +26 -0
  24. data/sample/query_basic_1.rb +3 -1
  25. data/sample/query_basic_2.rb +5 -3
  26. data/sample/query_basic_3.rb +2 -3
  27. data/sample/query_basic_4.rb +3 -4
  28. data/sample/query_basic_5.rb +2 -3
  29. data/sample/query_detail_1.rb +3 -1
  30. data/sample/query_detail_2.rb +3 -1
  31. data/sample/query_detail_3.rb +5 -3
  32. data/sample/{query_basic_6.rb → query_filter_1.rb} +7 -4
  33. data/sample/query_filter_2.rb +50 -0
  34. data/sample/{query_super_1.rb → query_find_1.rb} +0 -1
  35. data/sample/query_select_1.rb +51 -0
  36. data/sample/query_skip_limit_1.rb +47 -0
  37. data/sample/query_skip_limit_2.rb +49 -0
  38. data/sample/query_sort_order_1.rb +46 -0
  39. data/sample/save_basic_1.rb +1 -2
  40. data/sample/save_basic_2.rb +1 -2
  41. data/sample/save_basic_3.rb +1 -2
  42. data/sample/save_detail_1.rb +7 -4
  43. data/sample/save_detail_2.rb +7 -4
  44. data/sample/save_detail_3.rb +11 -8
  45. data/sample/save_verify_1.rb +7 -4
  46. data/sample/save_verify_3.rb +1 -1
  47. data/sample/save_verify_5.rb +3 -3
  48. data/sample/save_verify_6.rb +3 -3
  49. data/sample/save_verify_7.rb +23 -0
  50. data/sample/update_basic_1.rb +13 -0
  51. data/sample/zap_basic_2.rb +2 -2
  52. data/sample/zap_basic_3.rb +2 -2
  53. data/sample/zbenchmark_search_1.rb +110 -0
  54. data/sample/zbenchmark_search_2.rb +110 -0
  55. data/sample/zbenchmark_search_3.rb +90 -0
  56. metadata +19 -12
  57. data/sample/multi_docs_2.rb +0 -58
  58. data/sample/query_limit_1.rb +0 -44
  59. data/sample/query_order_1.rb +0 -49
  60. data/sample/query_projection_1.rb +0 -44
  61. data/sample/template_article.rb +0 -5
  62. data/sample/template_person.rb +0 -12
@@ -4,10 +4,12 @@
4
4
 
5
5
  == 特徴
6
6
 
7
- * 組込みと標準添付を除いて、mongo driver と bson のみに依存する軽いライブラリである。
8
- * 項目デフォルト値をブロックで記述できる.
9
- * 項目制約条件を Array, Range, Proc で記述できる.
10
- * 保存時および値設定時に制約条件を満たすか検査する.
7
+ * 組込みと標準添付を除いて、mongo driver と bson のみに依存する軽いライブラリである.
8
+ * ドキュメント項目の制約条件を Array, Range, Regexp, Proc インスタンスまたは基本クラスで記述できる.
9
+ * ドキュメント保存時に制約条件を満たすか検査する.
10
+ * ドキュメントの項目値設定時に制約条件を満たすか検査する.
11
+ * ドキュメントの未定義項目の内容を値または Proc で記述できる.
12
+ * ドキュメント作成時および更新時の項目内容を値または Proc で記述できる.
11
13
 
12
14
  == 導入
13
15
 
@@ -30,17 +32,13 @@ gem 'mongous'
30
32
 
31
33
  == 使い方
32
34
 
33
- === 簡素な定義
35
+ === 簡潔な定義
34
36
 
35
37
  [source,ruby]
36
38
  ----
37
39
  require "mongous"
38
40
 
39
- Mongous.connect!
40
-
41
- class Book
42
- include Mongous::Document
43
- end
41
+ Mongous.attach! :Book
44
42
  ----
45
43
 
46
44
  === 詳細な定義
@@ -54,15 +52,19 @@ Mongous.connect! ["localhost:27017"], database: "test"
54
52
  class Book
55
53
  include Mongous::Document
56
54
 
57
- field :title, String, :must
55
+ field :title, String, :must
58
56
  field :author, String
59
57
  field :publisher, String
60
- field :style, String, ["A4","B5","A5","B6"]
61
- field :price, Integer, (0..1_000_000)
62
- field :page, Integer, proc{ page % 4 == 0 }
63
- field :publish_at, Date, &proc{ Date.today }
64
- field :isbn, String, proc{ isbn? }
65
- field :lang, String, &proc{ "ja" }
58
+ field :style, String, %w[hardcover, softcover, paperback]
59
+ field :size, String, /[AB]\d/
60
+ field :price, Integer, (0..1_000_000)
61
+ field :page, Integer, proc{ page % 4 == 0 }
62
+ field :isbn, String, proc{ isbn? }
63
+ field :lang, String, default: "en"
64
+ field :created_at, Time, create: proc{ Time.now }
65
+ field :updated_at, Time, update: proc{ Time.now }
66
+
67
+ filter :foobar, {title: /foobar/}
66
68
 
67
69
  verify :strict
68
70
  verify do
@@ -84,13 +86,13 @@ end
84
86
  book = Book.new
85
87
  book.title = "title 1"
86
88
  book.price = 1000
87
- book.style = "A4"
89
+ book.size = "A4"
88
90
  book.save
89
91
 
90
- book = Book.new( title: "title 2", price: 2000, style: "A5" )
92
+ book = Book.new( title: "title 2", price: 2000, size: "A5" )
91
93
  book.save
92
94
 
93
- doc = { title: "title 3", price: 3000, style: "A6" }
95
+ doc = { title: "title 3", price: 3000, size: "A6" }
94
96
  Book.create( **doc )
95
97
  ----
96
98
 
@@ -100,44 +102,56 @@ Book.create( **doc )
100
102
  ----
101
103
  pp books = Book.all
102
104
 
103
- p book = Book.filter( title: "title 1" ).first
105
+ p book = Book.where( title: "title 1" ).first
104
106
 
105
- books = Book.filter( title: /title/ ).all
107
+ books = Book.where( title: /title/ ).all
106
108
  books.each do |book|
107
109
  p book
108
110
  end
109
111
 
110
- Book.filter( title: /title/ ).projection( _id: 0 ).each do |book|
112
+ Book.where( title: /title/ ).projection( _id: 0 ).each do |book|
111
113
  p book
112
114
  end
113
115
 
114
- Book.filter( price: (1..2000), style: ["A4","A5"] ).each do |book|
116
+ Book.where( price: (1..2000), size: ["A4","A5"] ).each do |book|
115
117
  p book
116
118
  end
117
119
 
118
- filter1 = Book.filter( title: /title/ )
119
- filter2 = Book.filter( price: (1..2000) )
120
- filter3 = Book.filter( style: ["A4","A5"] )
120
+ filter1 = Book.where( title: /title/ )
121
+ filter2 = Book.where( :foobar )
122
+ filter3 = Book.where( price: (1..2000) )
123
+ filter4 = Book.where( size: ["A4","A5"] )
124
+
121
125
  Book.not( filter1 ).each do |book|
122
126
  p book
123
127
  end
124
- Book.and( filter1, filter2 ).each do |book|
128
+ Book.and( filter1, filter3 ).each do |book|
129
+ p book
130
+ end
131
+ Book.or( filter2, filter4 ).each do |book|
132
+ p book
133
+ end
134
+
135
+ Book.find( { title: /title/ }, { projection: {_id: 0} } ).each do |book|
125
136
  p book
126
137
  end
127
- Book.or( filter1, filter3 ).each do |book|
138
+
139
+ Book.where( title: /title/ ).select( _id: 0 ).each do |book|
128
140
  p book
129
141
  end
130
142
 
131
- Book.find( {}, { projection: {_id: 0} } ).each do |book|
143
+ Book.select( _id: 0 )[0, 5].each do |book|
132
144
  p book
133
145
  end
146
+
147
+ pp Book.select( :title, :price, :size )[5, 5].all
134
148
  ----
135
149
 
136
150
  === ドキュメント更新
137
151
 
138
152
  [source,ruby]
139
153
  ----
140
- book = Book.filter( title: "title 1" ).first
154
+ book = Book.where( title: "title 1" ).first
141
155
  book.title = "title 1 [update]"
142
156
  book.save
143
157
  ----
@@ -146,7 +160,7 @@ book.save
146
160
 
147
161
  [source,ruby]
148
162
  ----
149
- book = Book.filter( title: "title 1" ).first
163
+ book = Book.where( title: "title 1" ).first
150
164
  book.delete
151
165
  ----
152
166
 
@@ -156,7 +170,7 @@ book.delete
156
170
 
157
171
  [source,ruby]
158
172
  ----
159
- Mongous.connect!( hosts_or_uri = nil, **opts )
173
+ Mongous.connect!( hosts_or_uri = nil, **options )
160
174
  ----
161
175
 
162
176
  * Result:
@@ -164,38 +178,116 @@ Mongous.connect!( hosts_or_uri = nil, **opts )
164
178
 
165
179
  * Parameter:
166
180
  ** hosts_or_uri: ホスト配列または URI (default: ["localhost:21017"])
167
- ** opts: オプション
181
+ ** options: オプション
168
182
  *** file: データベース構成定義ファイルへのパス
169
183
  *** mode: 実行モード (default: "development")
170
184
  *** database: データベース名 (default: "test")
171
- *** * Mongo::Client.new のその他オプション引数
185
+ *** Mongo::Client.new のその他オプション引数
172
186
 
173
187
  === データベースに接続する
174
188
 
175
189
  [source,ruby]
176
190
  ----
177
- Mongous.connect( hosts_or_uri = nil, **opts )
191
+ Mongous.connect( hosts_or_uri = nil, **options )
178
192
  ----
179
193
 
180
194
  * Result:
181
- ** Mongo::Client.
195
+ ** Mongo::Client インスタンス.
182
196
 
183
- === ドキュメントの機能を取り入れる.
197
+ === コレクション操作クラスをデフォルト設定で定義する.
198
+
199
+ [source,ruby]
200
+ ----
201
+ Mongous.attach!( *names )
202
+ ----
203
+
204
+ * Result:
205
+ ** nil.
206
+
207
+ * Parameter:
208
+ ** names: コレクション名. (String または Symbol)
209
+
210
+ === コレクション操作クラスにドキュメントの機能を取り入れる.
184
211
 
185
212
  [source,ruby]
186
213
  ----
187
214
  include Mongous::Document
188
215
  ----
189
216
 
217
+ === 別のデータベースを割り当てる.
218
+
219
+ [source,ruby]
220
+ ----
221
+ self.client=( client )
222
+ ----
223
+
224
+ * Result:
225
+ ** Mongo::Client インスタンス.
226
+
227
+ * Parameter:
228
+ ** client: Mongo::Client インスタンス.
229
+
230
+ === Get binded database.
231
+
232
+ [source,ruby]
233
+ ----
234
+ self.client
235
+ ----
236
+
237
+ * Result:
238
+ ** Mongo::Client インスタンス.
239
+
240
+ * Parameter:
241
+ ** None.
242
+
243
+ === 別のコレクションを割り当てる.
244
+
245
+ [source,ruby]
246
+ ----
247
+ self.collection_name=( collection_name )
248
+ ----
249
+
250
+ * Result:
251
+ ** Collection name 文字列.
252
+
253
+ * Parameter:
254
+ ** collection_name: コレクション名.
255
+
256
+ === Get binded collection name.
257
+
258
+ [source,ruby]
259
+ ----
260
+ self.collection_name
261
+ ----
262
+
263
+ * Result:
264
+ ** Collection name 文字列.
265
+
266
+ * Parameter:
267
+ ** None.
268
+
269
+ === Get collection.
270
+
271
+ [source,ruby]
272
+ ----
273
+ self.collection( collection_name = nil )
274
+ ----
275
+
276
+ * Result:
277
+ ** Mongo::Collection インスタンス.
278
+
279
+ * Parameter:
280
+ ** collection_name: 一時指定するコレクション名.
281
+
190
282
  === ドキュメントの要素を定義する.
191
283
 
192
284
  [source,ruby]
193
285
  ----
194
- field( label, *attrs, &block )
286
+ self.field( symbol, *attrs, **items )
195
287
  ----
196
288
 
197
289
  * Parameter:
198
- ** label: 項目名シンボル
290
+ ** symbol: 項目名
199
291
  ** attrs: 項目属性
200
292
  *** Class: 項目検証用 Class
201
293
  *** Proc: 項目検証用 Proc
@@ -203,17 +295,20 @@ field( label, *attrs, &block )
203
295
  *** Array: 項目検証用配列
204
296
  *** Symbol: 特別な指示子
205
297
  **** must: ナル値でも空文字列でもない
206
- ** block: デフォルト値を返す
298
+ ** items: 保存時の操作.
299
+ *** default: 未定義のときの値または Proc.
300
+ *** create: ドキュメントを新規保存するときの値または Proc.
301
+ *** update: ドキュメントを更新するときの値または Proc.
207
302
 
208
303
  === 保存や代入の前にドキュメントの要素を検証する.
209
304
 
210
305
  [source,ruby]
211
306
  ----
212
- verify( *syms, &block )
307
+ self.verify( *directives, &block )
213
308
  ----
214
309
 
215
310
  * Parameter:
216
- ** syms: 条件シンボル
311
+ ** directives: 条件シンボル
217
312
  *** strict: 定義済み項目名であることを検証する.
218
313
  ** block: 各項目値を検証して真偽を返す内容を記述する.
219
314
 
@@ -221,18 +316,18 @@ verify( *syms, &block )
221
316
 
222
317
  [source,ruby]
223
318
  ----
224
- index( *syms, **opts )
319
+ self.index( *symbols, **options )
225
320
  ----
226
321
 
227
322
  * Parameter:
228
- ** syms: 項目名シンボル
229
- ** opts: Mongo::Collection#indexes() のオプション.
323
+ ** symbols: 項目名
324
+ ** options: Mongo::Collection#indexes() のオプション.
230
325
 
231
326
  === 項目値がナル値でも空文字列でもないことを検証する.
232
327
 
233
328
  [source,ruby]
234
329
  ----
235
- having?( label )
330
+ self.having?( label )
236
331
  ----
237
332
 
238
333
  * Result:
@@ -241,6 +336,161 @@ having?( label )
241
336
  * Parameter:
242
337
  ** label: メソッド呼び出しする項目名.
243
338
 
339
+ === 検索条件に名前をつける.
340
+
341
+ [source,ruby]
342
+ ----
343
+ self.filter( symbol, filter_or_cond )
344
+ ----
345
+
346
+ * Parameter:
347
+ ** symbol: 項目名
348
+ ** filter_or_cond: フィルタまたは検索条件
349
+
350
+ === 出力項目を選択する.
351
+
352
+ [source,ruby]
353
+ ----
354
+ Mongous::Document.select( *keys, **kwargs )
355
+ Mongous::Filter#select( *keys, **kwargs )
356
+ ----
357
+
358
+ * Result:
359
+ ** Mongous::Filter instance.
360
+
361
+ * Parameter:
362
+ ** keys: 項目名
363
+ ** kwargs: 項目名と項目値.
364
+
365
+ === 検索条件.
366
+
367
+ [source,ruby]
368
+ ----
369
+ Mongous::Document.where( filter = nil, **conditions )
370
+ Mongous::Filter#where( filter = nil, **conditions )
371
+ ----
372
+
373
+ * Result:
374
+ ** Mongous::Filter instance.
375
+
376
+ * Parameter:
377
+ ** filter: 項目名またはフィルタインスタンス
378
+ ** conditions: 検索条件
379
+
380
+ === 否定検索条件.
381
+
382
+ [source,ruby]
383
+ ----
384
+ Mongous::Document.not( filter = nil, **conditions )
385
+ Mongous::Filter#not( filter = nil, **conditions )
386
+ ----
387
+
388
+ * Result:
389
+ ** Mongous::Filter instance.
390
+
391
+ * Parameter:
392
+ ** filter: 項目名またはフィルタインスタンス
393
+ ** conditions: 検索条件
394
+
395
+ === 論理積検索条件.
396
+
397
+ [source,ruby]
398
+ ----
399
+ Mongous::Document.and( *filters )
400
+ Mongous::Filter#and( *filters )
401
+ ----
402
+
403
+ * Result:
404
+ ** Mongous::Filter instance.
405
+
406
+ * Parameter:
407
+ ** filters: 項目名またはフィルタインスタンス
408
+
409
+ === 論理和検索条件.
410
+
411
+ [source,ruby]
412
+ ----
413
+ Mongous::Document.or( *filters )
414
+ Mongous::Filter#or( *filters )
415
+ ----
416
+
417
+ * Result:
418
+ ** Mongous::Filter instance.
419
+
420
+ * Parameter:
421
+ ** filters: 項目名またはフィルタインスタンス
422
+
423
+ === ドキュメントを作成.
424
+
425
+ [source,ruby]
426
+ ----
427
+ Mongous::Document.create( **doc )
428
+ ----
429
+
430
+ * Result:
431
+ ** nil.
432
+
433
+ * Parameter:
434
+ ** doc: キーワード引数.
435
+
436
+ === ドキュメントを保存.
437
+
438
+ [source,ruby]
439
+ ----
440
+ Mongous::Document#save
441
+ ----
442
+
443
+ * Result:
444
+ ** nil.
445
+
446
+ === ドキュメントをHashに変換.
447
+
448
+ [source,ruby]
449
+ ----
450
+ Mongous::Document#to_hash
451
+ ----
452
+
453
+ * Result:
454
+ ** Hash object.
455
+
456
+ === ドキュメントをJSONに変換.
457
+
458
+ [source,ruby]
459
+ ----
460
+ Mongous::Document#to_json
461
+ ----
462
+
463
+ * Result:
464
+ ** JSON String.
465
+
466
+ === ドキュメントの項目値を読む.
467
+
468
+ [source,ruby]
469
+ ----
470
+ Mongous::Document#[]( field_name )
471
+ Mongous::Document#field_name
472
+ ----
473
+
474
+ * Result:
475
+ ** 項目値.
476
+
477
+ * Parameter:
478
+ ** field_name: 項目名.
479
+
480
+ === ドキュメントの項目値を書く.
481
+
482
+ [source,ruby]
483
+ ----
484
+ Mongous::Document#[]=( field_name, field_value )
485
+ Mongous::Document#field_name = field_value
486
+ ----
487
+
488
+ * Result:
489
+ ** 項目値.
490
+
491
+ * Parameter:
492
+ ** field_name: 項目名.
493
+ ** field_value: 項目値.
244
494
 
245
495
  == 貢献
246
496