mongous 0.1.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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