以下のgistが超わかりやすかった。リンク先のコメント欄にはMongoid 5.0.1の場合も追記されている。
カテゴリー: データベース
Mongoidのany_ofがorではなくandになる
any_ofでorの結果を取得したいのに、結果はandになってしまう、という場合
User.any_of(:created_at.gte => 1.week.ago, :name => /^j/)
上記のコードは、1つのハッシュをany_ofとして渡している。any_ofはハッシュを複数渡すのが正解なので、以下のコードが正しい。
User.any_of({:created_at.gte => 1.week.ago}, {:name => /^j/})
よくミスするのでメモ。
Mongoidで複数のIDを配列に入れて一括検索
Mongoidで複数のIDを一気に取得したい時は、IDを入れた配列をfindに渡す。
ids = ['1234567890', '098765321', '2357111317'] User.find(ids)
Mongoidでcallback(before_save等)を呼ばずにupdateする
before_save, after_saveといったコールバックを実行せずにフィールドの値を更新するには、set
メソッドを利用する。after_saveの中で値を更新したい時に便利。
以下は例。
item = Item.first item.set(:description, "It's so nice!")
簡単ですね。
Mongooseでフィールドのデフォルト値を現在時刻にする
公式ドキュメントのdefaultsのページに書いてあった。
以下のように書けばドキュメント作成時のデフォルト値を現在時刻に指定できる。
new Schema({ date: { type: Date, default: Date.now } })
次のように書いていて、データベースに追加するたびに同じ時刻が書き込まれるので不思議に思っていた。
new Schema({ date: { type: Date, default: Date.now() } }) // あるいは new Schema({ date: { type: Date, default: (new Date()).getTime() } })
上記のように書いてしまうと、スキーマを作成した時刻が毎回書き込まれてしまう。defaultには、値も渡せるし、関数も渡せるということをよく理解していなかったためにミスした。
node.jsでMongoDBの接続に失敗する時
node.js, Express, MongoDBという組み合わせを、Ubuntu12.04のVM上で動かしていたら、Webアプリケーションを起動(npm start)した時に以下のようなエラーが出るようになってしまった。
[Error: failed to connect to [localhost:27017]]
以下2つの記事を参考にして解決。
node.jsでMongoDBを扱う
node.jsでMongoDBを扱う。Getting Started with MongoDB and Node.jsを参考にしつつ。
Debian6.0.2にMongoDBを入れてみる
Debian6.0.2にMongoDBを入れてみる。
参考にしたのはUbuntu 10.04にMongoDBをapt-getでインストール | ruco.laという記事。
続きを読む Debian6.0.2にMongoDBを入れてみる