0

次のドキュメント構造を取得しました。

プロファイルhas_manyDailyProviders。デイリープロバイダーembeds_oneフレンズ。Friends には整数フィールドがありますcount

  • 注 DailyProviderembeds_ONE以来、私は友人の配列を保存するつもりはありません。一日の総計です。友達は「読みやすさ」のためにもっと使われました。

集計フレームワークを使用して、プロバイダーと日付でグループ化されたすべてのカウントの合計を返すにはどうすればよいですか?

class Stat::Profile
  include Mongoid::Document
  has_many :daily_providers, class_name: 'Stat::DailyProvider'
  field :profile_id, type: Integer
end

class Stat::DailyProvider
  include Mongoid::Document

  belongs_to :profile, class_name: 'Stat::Profile'
  embeds_one :friends, class_name: 'Stat::DailyProvider::Friend', cascade_callbacks: true

  field :provider_name, type: String
  field :date, type: Integer, default: Time.zone.now.strftime('%Y%m%d').to_i

  validates :provider_name, uniqueness: true, presence: true, inclusion: { in: %w(facebook, linkedin) }
end

class Stat::DailyProvider::Friend
  include Mongoid::Document

  embedded_in :daily_provider, class_name: 'Stat::DailyProvider'

  field :count, type: Integer, default: 0
end

私は試した:

Stat::Profile.first.collection.aggregate(
  { '$unwind' => '$daily_providers' },
  { '$unwind' => '$daily_providers.friends' },
  {
    '$project' => {
      '_id' => 1,
      'daily_providers' => '$daily_providers'
    }
  },
  {
    '$group' => {
      '_id' => {
        'date' => '$daily_providers.date'
      },
      'count' => { '$sum' => '$daily_providers.friends.count' }
    }
  }
)

しかし、私は空の[]. 集約フレームワークは、単一のコレクションに埋め込まれたドキュメントでのみ機能しますか? または、参照ドキュメントで機能しますか?

4

1 に答える 1

1

MongoDB は参照を自動的にたどることができません。DBRefは、データベース ドライバの規則にすぎません。MongoDB 自体には意味がありません。

MongoDB は JOIN を実行しません - ピリオド。集約フレームワークは、一度に 1 つのコレクションのみを操作できます。これは、MapReduce などの他のほとんどのツールにも当てはまります。JOIN を実行する必要がある場合は、アプリケーション層でこれを実行する必要があります。最初のコレクションをクエリし、結果を検査し、それらに基づいて 2 番目のコレクションをクエリします。

このため、MongoDB では、ドキュメントを参照するのではなく、親オブジェクトにドキュメントを埋め込むことを推奨しています。

于 2013-09-14T19:28:36.830 に答える