Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

MongoDBで配列の要素数を条件にしたクエリ

$size 演算子を使うとよい。

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

例えばブログの記事のコレクションがあったとする。

{
  "_id": ObjectId("53c5339ab967a1dd52f52402"),
  "title": "Rubyでhogehoge",
  "tags": [
    "ruby", "programing", "rails"
  ],
  "body": "..."
}
{
  "_id": ObjectId("53c5339ab967a1dd52f52403"),
  "title": "MongoDBでfugafuga",
  "tags": [
    "mongodb", "database"
  ],
  "body": "..."
}

タグがちょうど2つ付いた記事を検索したいときは以下のようにする。

db.blogs.find({ "tags": { $size: 2 } });
// { "_id": ObjectId("53c5339ab967a1dd52f52403"), ... }

Mongoidだと with_size というのを使うと抽出できる。

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

Blog.where(:tags.with_size => 2)
Blog.with_size(tags: 2)

参考:
http://stackoverflow.com/questions/4705024/mongodb-query-based-on-count-of-embedded-document