この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
MongoDBのObjectId型を物検索するのににこれたたいいかか、
■ 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の設定内容?
もはもももをあります。
mongoDB | db.models.find({count:{‘$ gte’ => 1}}) | |
---|---|---|
Rails | Model.where(:count.gte => 1) | モンゴイド::基準 |
Rails | Model.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との比較表も定にありました。
決定に。