概要
RailsでMongoDBを使用する際、埋め込み型のリレーション(embeds_many)の子要素の数を取得する方法を記載します。
サンプル例題
親要素はブログ記事、子要素はコメントとして、ブログ記事にコメントの配列を持たせるようなイメージになります。
article.rb
class Article
include Mongoid::Document
field :_id, type: String
field :title, type: String
field :contents, type: String
embeds_many :comments
end
comment.rb
class Comment
include Mongoid::Document
field :user_id, type: String
field :post_comment, type: String
embedded_in :article
end
対応方法
対象のドキュメントについて、全子要素を取得して数をカウントする方法も考えられますが、今回は子要素の配列を取得せず、数のみを取得する方法を紹介します。
MongoDBのAggregation Pipelineの$project (aggregation)を使って、データ取得を行います。Program QAのmongoidを使用して、配列サイズを集計でカウントしますの記事を参考にしました。
実装サンプル
sample.rb
# コレクションの取得
db = Mongoid::Clients.default
articleCollection= db[:article]
# aggregateの実行
articleCollection.aggregate([
{
"$project" => {
_id: 1,
title: 1,
contents: 1,
comments_count: {"$size": "$comments"}
}
}
]).to_a