その他
    ホーム技術発信DoRubyRails4 + Mongoidでデータ収集するあれこれ

    Rails4 + Mongoidでデータ収集するあれこれ

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    MongoDBのObjectId型を物検索するのににこれたたいいかか、

    1. ObjectId型の_idを着する
    2. $ whereディレクター
    3. 分類の指定方法
    4. モンゴイドのセレクション展開の指定方法
    5. 集合体group_by?

     ObjectId型の_idを着検索する

    ▼サンプル

    > db.members.find();
    {"_id":ObjectId( "54daf7307da4107a3694f5af")、 "name": "hoge"、 "count":1、 "status":1123、 "created_at":ISODate( "2015-02-11T12:20:18.766Z" )、 "updated_at":ISODate( "2015-02-11T12:20:18.766Z")、 "deleted_at":0}
    

    MongoDBの_idはObjectId型要素ので、

    ざに「/ ^ 54d /」九なぷあり勝しませんでした。

    文字列型に変換して「ObjectId( “」からなっ一致するようにすししししますがううーん。

    Member.where( '$ where' => 'function(){return this._id.match(/ ^ ObjectId \(\ "%s /)}'%Regexp.escape(@ search.id))
    

    とたたら定的に変換する

    http://docs.mongodb.org/manual/reference/method/ObjectId.valueOf/

    ObjectId.valueOf()を外とカッコ内の文字列をしてせます。

    ObjectId( "54daf7307da4107a3694f5af")。valueOf()=> "54daf7307da4107a3694f5af"
    

    をしたばば↓このように書けます。(※ももするばができます)

    Member.where( '$ where' => 'function(){return this._id.valueOf()。match(/ ^%s /);}'%Regexp.escape(@ search.id))
    Member.where( '$ where' => 'this._id.valueOf()。match(/ ^%s /)'%Regexp.escape(@ search.id))
    

    省略、検索条件が$ where省略の属性は$ whereも省略可能。

    Member.where( 'this._id.valueOf()。match(/ ^%s /)'%Regexp.escape(@ search.id))
    

    使いまわすそうえる、モデルの方でスコープにPlanskお実行かと。

    コントローラ
    Member.id(@ search.id)
    
    モデル
    scope:id、->(id){'this._id.valueOf()。match(/ ^%s /)'%Regexp.escape(id)if id.present?}
    

    mongoシェルメソッド

    http://docs.mongodb.org/manual/reference/method/

    IntegerもtoString()で文字列に変換すし、正規表現での検索が可能です。

     $ where

    ここ$ whereです。

    http://docs.mongodb.org/manual/reference/operator/query/where/

    た内でjavascriptを実行したいいは$ whereをするようにとのこと。

    公式のコメント通りですが、ざ解説

    使いろろはえくらありようです。

    • 陳ができない
    • 絶された内でありない(表レベルであること)
    • $ whereBEGINの条件と國可能。先に$ whereBEGINの変形を評価する。(その結婚が0の属性$ where内は評価されない)
    • ファル3微妙
    • ず$ whereえずにありならそっちをててね
    • でできてなら、$ whereEVERの条件もいして、$ whereでで立てをすると、でなるのできる

    検索条件の指定方法

    ももな指定方法がますます。

    モンゴイドの選択

    http://mongoid.org/en/origin/docs/selection.html#standard

    http://mongoid.org/en/origin/docs/selection.html#symbol

    ▼名前に「ほ」をするもの

    (文字列型のフィールドフィールド正規表現表現が有効です)

    Member.where(name:/ ho /)
    

    ▼1と3コンポーネント

    Member.where(:status.all => [1,3])
    

    ▼1と3をこれ

    Member.where(:status.in => [1,3])
    

    ▼1と3をこれないもの

    Member.where(:status.nin => [1,3])
    

    ▼ステータスがnilfalseRefer

    Member.where(:status.exists => true)
    

    ▼ステータスが1

    Member.where(:status.gt => 1)
    

    ▼ステータスが1>

    Member.where(:status.gte => 1)
    

    ▼ステータスが3

    Member.where(:status.lt => 3)
    

    ▼ステータスが3

    Member.where(:category.lte => 3)
    

    ▼ステータスが1

    Member.where(:category.ne => 1)
    

    ▼updated_atg2015-02-1110:15:00.000円

    Member.where(:updated_at.gte => '2015-02-11 10:15') 
    

    ▼updated_atが2015-02-1110:15:01.000前前

     ミリ秒表ので、「2015-02-11 10:15.725」等男勝表1秒後のdatetimeで

    Member.where(:updated_at.lt => Time.at(Time.parse( '2015-02-11 10:15')。to_i + 1))
    

    モンゴイドのセレクション展開の選択方法

    Model.where()の術モンゴイドのセレクションダブルモデル、

    なりのように指定する、MongoDBのシェルとありのくらがいようです。

    db = Mongoid :: Sessions.default
    コレクション= db [:models]
    collection.find()
    

    矯正

    Model.collection.find()
    

    ※「Mongoid :: Sessions.default」はconfig / mongoid.ymlの設定内容?

    もはもももをあります。

    mongoDBdb.models.find({count:{‘$ gte’ => 1}})
    RailsModel.where(:count.gte => 1)モンゴイド::基準
    RailsModel.collection.find(count:{‘$ gte’ => 1})原付::クエリ

    オブジェクトオブジェクトオブジェクトオブジェクトオブジェクトオブジェクト。

    基準= Model.where(:count.gte => 1)
    
    ppcriteria.class
     => Mongoid :: Criteria
    
    ppcriteria.class.ancestors
     => [Mongoid :: Criteria、
     Mongoid :: Sessions :: Options、
     Mongoid :: Criteria :: Scopable、
     Mongoid :: Criteria :: Modified、
     Mongoid :: Criteria :: Marshalable、
     Mongoid :: Criteria :: Inspectable、
     Mongoid :: Criteria :: Findable、
     Origin :: Queryable、
     Origin ::オプション、
     Origin :: Selectable、
     Origin :: Aggregable、
     起源::マージ可能、
     Mongoid :: Contextual、
     可算、
     オブジェクト、
     Delayed :: MessageSending、
     Mongoid :: Extensions :: Object、
     BSON :: Object、
     Origin :: Extensions :: Object、
     ActiveSupport :: Dependencies :: Loadable、
     PP :: ObjectMixin、
     V8 :: Conversion :: Object、
     JSON :: Ext :: Generator :: GeneratorMethods :: Object、
     カーネル、
     BasicObject]
    
    moped = Model.collection.find(count:{'$ gte' => 1})
    
    pp moped.class
     =>原付::クエリ
    
    pp moped.class.ancestors
     => [Moped :: Query、
     Mongoid :: QueryCache :: Query、
     Mongoid :: QueryCache :: Cacheable、
     可算、
     オブジェクト、
     Delayed :: MessageSending、
     Mongoid :: Extensions :: Object、
     BSON :: Object、
     Origin :: Extensions :: Object、
     ActiveSupport :: Dependencies :: Loadable、
     PP :: ObjectMixin、
     V8 :: Conversion :: Object、
     JSON :: Ext :: Generator :: GeneratorMethods :: Object、
     カーネル、
     BasicObject]
    

     aggregatedegroup_byする

    MongoDBのシェルがされて↓ここにあるメソッドもメソッドを…

    http://docs.mongodb.org/manual/reference/method/

    data = Member.collection.aggregate({'$ group' => {'_id' => '$ count'、 'count' => {'$ sum' => 1}}})
    
    => [{"_ id" => 3、 "count" => 1}、{"_ id" => 2.0、 "count" => 2}、{"_ id" => 1.0、 "count" => 1} ]
    

    できました!

    pp data.class
     =>配列
    
    pp data.class.ancestors
     => [配列、
     Mongoid :: Extensions :: Array、
     BSON :: Array、
     BSON :: Encodable、
     Origin :: Extensions :: Array、
     カラム化、
     V8 :: Conversion :: Array、
     JSON :: Ext :: Generator :: GeneratorMethods :: Array、
     可算、
     オブジェクト、
     Delayed :: MessageSending、
     Mongoid :: Extensions :: Object、
     BSON :: Object、
     Origin :: Extensions :: Object、
     ActiveSupport :: Dependencies :: Loadable、
     PP :: ObjectMixin、
     V8 :: Conversion :: Object、
     JSON :: Ext :: Generator :: GeneratorMethods :: Object、
     カーネル、
     BasicObject]
    

    SQL特徴group_byとは別ですが、比較にらない

    Enumerable#group_byがますます。

    (Mongoid :: CriteriaもMoped :: QueryもEnumerableファンを実装してます)

    Member.where(:count.gte => 1).group_by {| member | member.status}
    Member.collection.find(count:{'$ gte' => 1})。group_by {| member | member [:status]}
    

    jsファイルを渡して、言いからコマンドは

    mongo sample_dev〜 / mongo / batch.js
    

    SQLとの比較表も定にありました。

    決定に。

    http://docs.mongodb.org/manual/reference/sql-comparison/