Как я могу заставить структуру агрегации работать со ссылочными документами?

У меня получилась следующая структура документа:

Профиль has_many DailyProviders. DailyProvider embeds_one Друзья. Друзья имеют целочисленное поле count.

  • ПРИМЕЧАНИЕ. DailyProvider embeds_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' }
    }
  }
)

Но я получаю пустой []. Работает ли структура агрегации только с документами, включенными в одну коллекцию? Или он может работать со ссылочными документами?


person Christian Fazzini    schedule 14.09.2013    source источник
comment
Потому что в MongoDB нет объединений?   -  person Sammaye    schedule 14.09.2013
comment
Означает ли это, что структура агрегации не будет работать со структурой схемы, подобной этой?   -  person Christian Fazzini    schedule 14.09.2013
comment
MongoDB не может отслеживать ссылки на другие коллекции в запросе или функции агрегирования. Только текущая/единая коллекция.   -  person WiredPrairie    schedule 14.09.2013


Ответы (1)


MongoDB не может автоматически следовать ссылкам. DBRef — это только соглашение для драйверов базы данных. Они не имеют никакого значения для самой MongoDB.

MongoDB не выполняет JOIN - точка. Платформа агрегации может работать только с одной коллекцией одновременно. Это также относится к большинству других инструментов, таких как MapReduce. Когда вам нужно выполнить JOIN, вам нужно сделать это на прикладном уровне: запросить первую коллекцию, проверить результаты и запросить вторую на их основе.

По этой причине MongoDB поощряет встраивание документов в родительский объект вместо ссылки на них.

person Philipp    schedule 14.09.2013