質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Q&A

1回答

1935閲覧

mongoDBとmongoidの関係性

nakanot

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

0グッド

0クリップ

投稿2018/04/08 08:13

現在sinatra + mongoidでアプリケーションを作成しています。
その中で、mongoDBとmongoidの関係性についてよくわからずなので質問させてください。
現状の認識から、もしかしたらこういうことなのかな?ってところで欲しい知識が得られず困っております。

DB、modelの知識はほとんどありません。

現状の認識

ruby <-> mondoid <-> ruby <-> mongoDB

となり、mongoidではmongoDBに入れるために整形をするのみで、
mongoDBに入力するためには

ruby

1$collection.insert_many([ 2 { 3 first_name: data.first_name, 4 last_name: data.last_name 5 } 6 ])

のようにinsert_manyをしないといけない。
しかしこの場合mongoidの必要性がないので、下記のように思うようになりました。

もしかしたら

ruby <-> mondoid <-> mongoDB

となり、本来はmongoid.ymlに記載してあるデータベースに繋がって、

ruby

1person = Person.new( 2 :first_name => first_name, 3 :last_name => last_name 4 )

をすればmongoDBの方に書き込まれるのではないか?と思った次第です。

しかしドキュメントみても次に繋がる事柄が得られないのが現状です。
Criteriaという言葉も出て来て...。

下記をご教授願えますでしょうか。
1.「現状の認識」「もしかして」のどちらが認識として正しいのか。また、違う場合はどういった認識が正しいのか。
2.Criteriaを用いる理由はなんなのか。

念のため書いているコードを載せておきます。

宜しくお願い致します。

model/user.rb

ruby

1class Person 2 include Mongoid::Document 3 field :first_name, type: String 4 field :middle_name, type: String 5 field :last_name, type: String 6end 7

app.rbの一部

ruby

1get '/' do 2 3 testData = [ 4 { "first_name": "test1", "last_name": "普通酒" }, 5 { "first_name": "test2", "last_name": "本醸造酒" }, 6 { "first_name": "test3", "last_name": "特別本醸造酒" }, 7 { "first_name": "test4", "last_name": "吟醸酒" }, 8 { "first_name": "test5", "last_name": "大吟醸酒" }, 9 { "first_name": "test6", "last_name": "純米酒" }, 10 { "first_name": "test7", "last_name": "特別純米酒" }, 11 { "first_name": "test8", "last_name": "純米吟醸酒" }, 12 { "first_name": "test9", "last_name": "純米大吟醸酒" } 13 ] 14 15 # 今の所一回一回初期化 16 Person.delete_all 17 18#ここで一度modelに保存 19 testData.each_with_index do |data, i| 20 21 first_name = testData[i][:first_name] 22 last_name = testData[i][:last_name] 23 24 person = Person.new( 25 :first_name => first_name, 26 :last_name => last_name 27 ) 28 person.save 29 end 30 31#ここでmongoDBに保存 32 data = Person.all() 33 data.each do |data| 34 puts "--お酒だよ--" 35 puts data.first_name 36 puts data.last_name 37 puts "--save...--" 38 $collection.insert_many([ 39 { 40 first_name: data.first_name, 41 last_name: data.last_name 42 } 43 ]) 44 end 45 46 @title = Person.find() 47 slim :index 48 end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

わかりにくい説明で申し訳ないですが・・・

MongoidはMongoDBのO/RMapper(正しくはMongoDBはDocumentなのでODMapperらしいですが・・・)です。
O/RMapperって何って言われると長くなっちゃうんで下記のとことかググったりしてもらうといいんですが・・・
http://e-words.jp/w/O-Rマッピング.html
Ruby側のオブジェクトとDB(今回だとMongo)を関連付けてくれて保存や検索とかの機能を提供してくれてるものです。
なので1.に関していうと『もしかして』のほうがただしいいです。
ただし、Mongoにデータが保存されるタイミングは

ruby

1person = Person.new( 2 :first_name => first_name, 3 :last_name => last_name 4 ) 5

ではなく、このあとに

ruby

1person.save 2

と#saveを呼び出したタイミングです。

ちなみに
ruby <-> mongoid <-> mongoDB
とありますが細かく書くと
ruby <-> mongoid <-> mongo-ruby-driver <-> MongoDB
になります。
mongo-ruby-driverはMongoDBに対して実際に操作を行っているライブラリですが
これを直接使うのはいろいろつらいのでmongoidが使いやすいように機能を提供してくれてます。
なのでMongoidを使っている限りは利用者はMongoidつかえばMongoDBに対して操作することができます。

でapp.rbのソースを見ると
『#ここで一度modelに保存』
という箇所は実際はこの時点でMongoに保存しています。

そして『#ここでmongoDBに保存』ってありますが、
実際は『#ここで一度modelに保存』でMongoに保存したデータを
Person.all()でMongoからデータを検索し取得していて
その検索した結果をまた($collectionはどこからでてきたのかという疑問はあるが・・・)保存しにいっちゃってます。
なのでこのプログラムは二重にデータを登録しにいってしまってます。

2についてですが
たとえばirbでもこのプログラム中にでもいいんですが

ruby

1c = Person.where(first_name: 'test1') 2p c 3

なんて書いて実行するとcの中身が表示されますが、
クラス名が『Mongoid::Criteria』とかになってると思います。
そしてこれに対して#eachとか#to_aを実行すると実際にMongoDBに検索しにいって結果を返してくれます。
なのでCriteriaはMongoidのクエリインターフェイスで
利用する側はこのCriteriaを通してMongoにデータを検索しにくようになってます。
なので実はこのプログラムもPerson.allでCriteriaつかってデータを取得しにいってます。

あまり回答になって内容であれですがこんなところです。

投稿2018/04/09 12:14

nyandora

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakanot

2018/04/10 01:10

お世話になっております。 回答ありがとうございます。 自分の知りたかった事そのままです。大変助かります。 >>($collectionはどこからでてきたのかという疑問はあるが・・・) すみません。下記のような感じでMongoを呼び出した際にそれを格納している変数です。。 --- db = Mongo::Client.new(["localhost"], :database => 'test') $collection = db[:persons] --- 加え、少し確認をさせて頂きたいのですがよろしいでしょうか。 ruby <-> mongoid <-> mongoDB (ruby <-> mongoid <-> mongo-ruby-driver <-> MongoDB) が正しいようですが、 --- person.save --- してもMongoの方にデータが入らない故に、 ruby <-> mondoid <-> ruby <-> mongoDB のような状況になっていました。 「してもMongoの方にデータが入らない故に、」 これが起きているのはこれから調べて見ますが、 mongoidの設定ファイルなどが間違っているから mongoidとMongoが繋がっていない状況? その状況だから person.save してもmodelとして保存されるだけで、 Mongoに保存されないという認識で大丈夫でしょうか...。 (一概には言えないと思いますが...。) すみません、宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問